 var g_CMYKSamples = [
255,255,255, 225,226,228, 199,200,202, 173,174,178, 147,149,152, 123,125,128,  99, 99,102,  69, 70, 71,  34, 30, 31, 
255,253,229, 226,224,203, 200,199,182, 173,173,158, 149,148,135, 125,124,113,  99, 99, 90,  70, 69, 63,  33, 29, 24, 
255,251,204, 228,223,182, 201,198,163, 174,172,142, 150,147,122, 125,123,101,  99, 98, 80,  70, 68, 54,  32, 28, 16, 
255,249,179, 230,222,160, 203,197,144, 174,170,124, 150,145,105, 125,122, 88,  99, 97, 69,  70, 68, 46,  31, 28,  6, 
255,247,154, 229,220,138, 203,195,122, 176,169,107, 150,145, 91, 125,121, 74, 100, 96, 57,  70, 67, 35,  29, 26,  0, 
255,246,128, 231,217,114, 205,194,101, 176,167, 88, 150,144, 75, 125,120, 60, 100, 96, 44,  70, 66, 24,  28, 26,  0, 
255,244, 96, 231,217, 87, 203,192, 78, 175,167, 66, 150,143, 56, 125,119, 43, 100, 95, 29,  69, 66,  7,  26, 26,  0, 
255,243, 51, 232,215, 51, 204,191, 43, 176,165, 38, 150,142, 28, 125,118, 17,  99, 94,  0,  68, 65,  0,  24, 25,  0, 
255,241,  0, 231,215,  0, 203,190,  0, 176,164,  0, 150,141,  0, 126,117,  0,  99, 93,  0,  68, 65,  0,  24, 25,  0, 
252,228,238, 222,201,211, 197,180,190, 171,156,166, 147,133,143, 123,111,119,  99, 88, 94,  71, 61, 66,  34, 22, 26, 
254,226,213, 224,201,191, 199,179,171, 172,155,148, 147,133,128, 123,110,106,  98, 87, 83,  70, 59, 57,  33, 21, 18, 
254,224,191, 224,199,172, 200,177,153, 173,154,133, 147,132,115, 123,109, 94,  98, 86, 74,  70, 59, 49,  32, 21,  9, 
255,222,168, 227,198,150, 200,175,135, 173,153,118, 148,130, 99, 123,109, 82,  98, 86, 64,  69, 58, 40,  31, 19,  0, 
255,221,145, 227,196,129, 201,174,115, 173,151, 99, 148,129, 85, 124,108, 69,  98, 85, 52,  69, 58, 30,  30, 19,  0, 
255,219,121, 227,195,109, 201,174, 97, 174,150, 83, 148,129, 70, 124,107, 55,  98, 84, 40,  69, 58, 19,  28, 18,  0, 
255,218, 92, 229,194, 82, 202,173, 75, 174,150, 63, 149,128, 51, 124,106, 39,  98, 84, 24,  68, 57,  3,  26, 18,  0, 
255,217, 54, 228,193, 52, 201,172, 46, 174,148, 36, 148,127, 27, 123,105, 14,  98, 83,  0,  68, 56,  0,  25, 18,  0, 
255,216,  0, 229,192,  2, 202,171,  4, 173,148,  0, 148,126,  0, 124,105,  0,  98, 83,  0,  68, 56,  0,  24, 17,  0, 
249,204,223, 219,181,199, 195,160,178, 170,140,156, 146,119,134, 123, 99,112,  98, 77, 88,  70, 52, 61,  34, 11, 20, 
250,201,200, 221,180,178, 197,159,161, 171,139,139, 147,119,120, 123, 98, 99,  98, 77, 78,  69, 51, 52,  34, 11, 10, 
252,201,180, 223,179,162, 197,159,144, 170,138,125, 146,117,107, 122, 97, 89,  98, 76, 69,  69, 50, 44,  32, 11,  2, 
252,199,158, 222,177,143, 199,158,127, 171,137,110, 147,117, 93, 122, 96, 76,  97, 75, 58,  69, 50, 36,  32, 10,  0, 
253,198,137, 223,177,123, 198,156,110, 171,136, 95, 146,116, 80, 122, 96, 65,  97, 75, 47,  69, 50, 25,  30, 10,  0, 
254,197,115, 225,175,104, 198,156, 92, 172,135, 79, 147,115, 66, 123, 95, 52,  98, 74, 37,  69, 49, 15,  29, 10,  0, 
254,196, 89, 224,175, 80, 199,154, 70, 172,134, 59, 146,114, 48, 122, 95, 36,  97, 74, 21,  68, 49,  0,  27,  9,  0, 
255,195, 57, 225,173, 52, 198,154, 44, 172,133, 36, 147,113, 26, 123, 94, 14,  98, 74,  0,  68, 49,  0,  26, 10,  0, 
254,194, 15, 225,172, 12, 198,153,  7, 172,132,  3, 146,113,  0, 123, 93,  0,  98, 73,  0,  68, 49,  0,  26,  9,  0, 
246,178,209, 218,159,186, 194,140,166, 168,122,145, 144,104,125, 121, 85,103,  97, 65, 81,  69, 41, 55,  34,  0, 12, 
248,176,186, 219,157,166, 195,139,149, 168,121,130, 144,103,111, 121, 85, 91,  97, 65, 71,  69, 41, 46,  34,  0,  4, 
249,175,168, 220,156,150, 196,139,135, 169,121,116, 144,103,100, 122, 84, 83,  98, 65, 63,  70, 41, 39,  33,  0,  0, 
249,175,148, 220,155,133, 196,138,119, 169,120,103, 145,101, 87, 121, 83, 71,  97, 65, 54,  69, 41, 31,  32,  0,  0, 
249,173,128, 222,154,115, 195,137,102, 170,119, 88, 145,101, 74, 122, 83, 59,  97, 64, 43,  68, 40, 20,  30,  0,  0, 
250,172,108, 221,154, 98, 195,136, 86, 170,118, 73, 145,100, 61, 122, 82, 48,  97, 63, 32,  69, 40, 11,  28,  0,  0, 
250,171, 85, 221,153, 76, 196,136, 67, 170,117, 56, 145, 99, 44, 121, 82, 33,  97, 63, 17,  68, 40,  0,  28,  0,  0, 
251,171, 58, 222,152, 50, 197,135, 43, 169,117, 34, 146, 99, 25, 121, 81, 10,  96, 63,  0,  68, 40,  0,  27,  0,  0, 
250,170, 26, 222,151, 19, 196,134, 13, 169,116,  4, 145, 99,  0, 122, 81,  0,  97, 63,  0,  67, 40,  0,  26,  0,  0, 
244,153,194, 215,136,173, 192,121,155, 167,104,135, 143, 89,115, 121, 72, 96,  97, 54, 75,  70, 31, 49,  34,  0,  6, 
245,153,173, 216,136,155, 192,120,138, 167,104,121, 144, 88,103, 121, 71, 85,  97, 54, 66,  69, 31, 42,  34,  0,  0, 
246,152,157, 217,135,140, 193,120,126, 167,103,109, 143, 88, 92, 121, 72, 76,  97, 54, 58,  69, 31, 35,  33,  0,  0, 
245,150,139, 218,134,125, 193,119,111, 167,103, 96, 144, 87, 80, 121, 71, 66,  96, 53, 49,  68, 31, 26,  32,  0,  0, 
246,151,122, 218,133,108, 194,118, 96, 168,102, 81, 144, 86, 69, 120, 71, 55,  95, 53, 39,  68, 30, 17,  31,  0,  0, 
248,150,103, 218,133, 91, 193,118, 81, 168,102, 69, 143, 86, 56, 120, 70, 43,  96, 53, 28,  68, 31,  6,  29,  0,  0, 
247,149, 81, 218,132, 72, 194,117, 62, 168,101, 52, 144, 86, 42, 121, 70, 29,  96, 52, 13,  68, 30,  0,  28,  0,  0, 
247,148, 55, 219,131, 50, 194,117, 43, 167,101, 32, 144, 85, 22, 120, 69,  8,  96, 52,  0,  67, 30,  0,  27,  0,  0, 
247,147, 29, 218,131, 24, 194,116, 20, 168,100, 11, 144, 85,  0, 120, 69,  0,  96, 52,  0,  67, 30,  0,  26,  0,  0, 
242,130,179, 214,114,160, 190,101,143, 166, 87,125, 143, 72,107, 120, 58, 88,  96, 42, 68,  69, 17, 44,  35,  0,  0, 
243,129,161, 215,114,143, 191,101,128, 166, 87,113, 143, 73, 96, 120, 58, 79,  96, 41, 60,  69, 18, 37,  33,  0,  0, 
243,129,146, 216,114,130, 192,101,117, 166, 87,101, 143, 72, 86, 121, 58, 69,  96, 42, 52,  69, 18, 29,  31,  0,  0, 
243,128,130, 216,114,115, 191,101,102, 165, 86, 88, 142, 72, 75, 120, 58, 60,  95, 42, 43,  68, 19, 21,  30,  0,  0, 
244,127,112, 217,113,101, 192, 99, 89, 166, 85, 75, 142, 72, 63, 119, 57, 50,  96, 41, 35,  68, 19, 13,  30,  0,  0, 
244,127, 96, 216,112, 86, 191, 99, 75, 166, 86, 64, 143, 72, 52, 120, 57, 40,  95, 41, 24,  67, 20,  1,  29,  0,  0, 
245,126, 77, 216,113, 68, 191,100, 59, 166, 85, 49, 142, 71, 38, 119, 57, 26,  95, 41, 10,  67, 20,  0,  28,  0,  0, 
244,126, 55, 216,112, 48, 191, 99, 40, 166, 85, 31, 143, 71, 20, 119, 57,  6,  95, 42,  0,  67, 20,  0,  28,  0,  0, 
245,126, 33, 217,112, 26, 192, 99, 22, 166, 84, 11, 142, 70,  0, 119, 57,  0,  95, 41,  0,  66, 20,  0,  27,  0,  0, 
241,102,167, 213, 90,149, 189, 79,133, 165, 66,115, 141, 54, 98, 119, 41, 81,  96, 25, 63,  69,  0, 38,  30,  0,  0, 
241,102,149, 213, 90,133, 189, 79,119, 165, 66,103, 142, 55, 88, 119, 41, 71,  96, 25, 53,  69,  0, 31,  28,  0,  0, 
241,102,135, 214, 90,121, 190, 79,108, 165, 66, 92, 141, 55, 78, 119, 42, 63,  96, 26, 46,  69,  0, 24,  28,  0,  0, 
241,101,120, 214, 90,107, 189, 79, 95, 165, 67, 83, 141, 54, 68, 118, 41, 54,  95, 27, 39,  68,  0, 16,  27,  0,  0, 
241,102,106, 213, 90, 93, 189, 78, 82, 164, 67, 70, 141, 55, 58, 118, 42, 45,  94, 27, 29,  67,  2,  6,  27,  0,  0, 
242,101, 90, 214, 89, 79, 190, 79, 69, 166, 67, 59, 141, 55, 47, 118, 41, 35,  95, 27, 19,  67,  3,  0,  26,  0,  0, 
242,102, 72, 213, 89, 63, 191, 79, 56, 164, 67, 45, 141, 55, 34, 118, 42, 22,  94, 28,  6,  67,  3,  0,  26,  0,  0, 
242,100, 51, 214, 89, 45, 190, 78, 38, 164, 67, 30, 141, 55, 18, 118, 42,  3,  95, 28,  0,  66,  4,  0,  26,  0,  0, 
243,100, 33, 214, 90, 27, 190, 78, 22, 165, 67, 13, 141, 55,  0, 118, 43,  0,  94, 29,  0,  66,  5,  0,  26,  0,  0, 
237, 69,153, 211, 58,135, 187, 51,121, 163, 41,105, 141, 28, 90, 118, 15, 73,  96,  0, 56,  68,  0, 33,  25,  0,  0, 
239, 67,137, 212, 60,123, 189, 50,110, 163, 41, 94, 141, 29, 79, 118, 17, 65,  95,  0, 48,  69,  0, 26,  25,  0,  0, 
240, 69,124, 211, 60,111, 188, 50, 98, 163, 42, 85, 141, 31, 72, 118, 18, 57,  94,  0, 41,  68,  0, 19,  25,  0,  0, 
240, 70,112, 212, 61, 99, 188, 52, 87, 163, 41, 74, 140, 31, 62, 118, 20, 48,  94,  2, 32,  68,  0, 11,  24,  0,  0, 
239, 70, 98, 212, 62, 86, 188, 53, 77, 164, 42, 64, 140, 32, 52, 118, 20, 40,  94,  3, 24,  67,  0,  3,  23,  0,  0, 
239, 71, 85, 212, 61, 74, 187, 53, 65, 163, 44, 54, 140, 34, 43, 118, 22, 30,  95,  3, 14,  67,  0,  0,  23,  0,  0, 
239, 70, 67, 212, 62, 59, 188, 53, 51, 163, 45, 42, 141, 34, 31, 117, 22, 17,  94,  5,  2,  66,  0,  0,  23,  0,  0, 
239, 71, 50, 213, 62, 43, 188, 54, 37, 164, 45, 28, 139, 34, 16, 117, 22,  2,  94,  7,  0,  65,  0,  0,  23,  0,  0, 
240, 71, 34, 212, 63, 29, 189, 54, 24, 163, 46, 15, 139, 36,  2, 117, 25,  0,  94,  8,  0,  66,  0,  0,  23,  0,  0, 
237,  0,140, 209,  0,124, 186,  0,112, 162,  0, 97, 141,  0, 82, 118,  0, 67,  95,  0, 49,  68,  0, 27,  20,  0,  0, 
237,  0,126, 210,  0,113, 187,  0, 99, 163,  0, 86, 139,  0, 72, 118,  0, 58,  95,  0, 42,  67,  0, 20,  20,  0,  0, 
237,  1,114, 209,  1,102, 187,  0, 90, 163,  0, 78, 139,  0, 64, 118,  0, 50,  95,  0, 35,  67,  0, 13,  20,  0,  0, 
236, 16,102, 209,  7, 91, 186,  0, 80, 162,  0, 68, 139,  0, 56, 117,  0, 43,  94,  0, 27,  67,  0,  6,  20,  0,  0, 
238, 15, 89, 209, 13, 79, 186,  6, 69, 162,  0, 58, 139,  0, 47, 117,  0, 34,  93,  0, 20,  66,  0,  2,  20,  0,  0, 
237, 20, 78, 210, 12, 68, 187,  4, 59, 163,  0, 49, 139,  0, 38, 116,  0, 26,  94,  0, 11,  66,  0,  0,  20,  0,  0, 
237, 25, 64, 210, 18, 56, 186, 11, 48, 162,  4, 39, 138,  0, 27, 117,  0, 14,  93,  0,  0,  66,  0,  0,  20,  0,  0, 
238, 25, 48, 210, 22, 43, 186, 15, 35, 162,  8, 26, 140,  0, 14, 117,  0,  0,  93,  0,  0,  65,  0,  0,  20,  0,  0, 
238, 28, 35, 210, 21, 30, 187, 15, 24, 162,  8, 16, 139,  1,  2, 117,  0,  0,  93,  0,  0,  65,  0,  0,  22,  0,  0, 
219,242,252, 195,214,225, 172,191,201, 148,165,175, 127,142,150, 106,119,126,  84, 95,101,  58, 66, 72,  24, 27, 32, 
222,239,226, 196,213,202, 173,189,180, 150,165,158, 129,141,135, 107,118,113,  85, 94, 90,  58, 66, 63,  21, 26, 24, 
223,237,203, 198,211,182, 175,188,163, 152,164,141, 129,140,121, 107,117,101,  85, 93, 80,  58, 64, 54,  21, 26, 18, 
226,236,179, 201,210,160, 177,187,143, 153,162,125, 130,139,106, 108,116, 89,  85, 92, 69,  58, 64, 45,  20, 25,  8, 
227,234,153, 201,208,139, 178,185,124, 154,161,107, 131,138, 91, 108,115, 75,  85, 91, 58,  58, 63, 35,  17, 25,  0, 
229,233,130, 203,207,116, 178,184,104, 154,160, 90, 131,137, 76, 109,114, 62,  85, 90, 46,  58, 63, 25,  16, 24,  0, 
230,231,100, 202,205, 90, 179,183, 80, 154,159, 69, 131,136, 57, 109,113, 46,  86, 90, 32,  58, 63, 10,  14, 24,  0, 
230,230, 65, 204,204, 58, 180,182, 52, 155,157, 44, 132,135, 35, 110,113, 24,  86, 89,  9,  57, 62,  0,  11, 24,  0, 
232,230, 19, 204,204, 19, 180,181, 17, 155,157, 10, 131,134,  2, 109,112,  0,  85, 89,  0,  57, 62,  0,  10, 23,  0, 
218,216,236, 194,192,211, 172,171,188, 149,149,164, 128,127,141, 106,106,119,  84, 84, 94,  59, 57, 66,  25, 18, 26, 
221,214,211, 196,191,190, 174,170,170, 150,148,148, 128,126,127, 107,105,106,  85, 83, 84,  59, 56, 58,  23, 17, 18, 
222,213,190, 197,189,170, 175,169,153, 151,147,133, 129,126,113, 108,105, 94,  85, 82, 74,  59, 56, 49,  22, 17, 11, 
224,211,168, 199,188,151, 175,168,135, 152,146,117, 129,124, 99, 107,103, 82,  84, 82, 64,  59, 55, 41,  21, 17,  1, 
224,210,145, 199,187,130, 176,166,117, 152,145,101, 129,123, 86, 107,103, 70,  85, 81, 53,  58, 55, 31,  19, 17,  0, 
227,208,123, 200,186,110, 177,165, 98, 153,143, 84, 130,122, 70, 108,102, 57,  85, 80, 41,  58, 54, 20,  18, 16,  0, 
227,208, 97, 202,185, 86, 177,164, 77, 153,142, 65, 130,122, 54, 108,101, 42,  85, 80, 27,  58, 54,  7,  16, 16,  0, 
228,206, 66, 202,184, 58, 178,163, 50, 154,141, 42, 131,121, 33, 109,101, 21,  86, 79,  5,  58, 54,  0,  13, 16,  0, 
228,206, 29, 202,183, 25, 178,163, 20, 154,141, 15, 131,121,  5, 108,100,  0,  85, 79,  0,  58, 53,  0,  13, 16,  0, 
217,193,221, 193,172,198, 172,153,178, 149,133,154, 128,114,132, 107, 94,111,  85, 74, 89,  59, 49, 61,  25,  8, 22, 
219,191,198, 195,171,178, 173,153,159, 149,132,139, 128,113,119, 107, 94,100,  85, 73, 79,  59, 48, 52,  25,  7, 14, 
221,191,180, 196,170,160, 174,152,144, 150,132,125, 129,113,107, 107, 93, 89,  85, 73, 69,  59, 48, 45,  23,  7,  4, 
222,189,159, 197,169,142, 174,151,127, 151,131,110, 129,112, 94, 108, 93, 78,  85, 72, 60,  58, 47, 37,  22,  7,  0, 
223,188,138, 197,168,123, 175,150,109, 151,130, 95, 130,111, 81, 108, 92, 65,  85, 72, 49,  59, 47, 27,  21,  7,  0, 
224,187,118, 198,167,105, 176,149, 93, 152,129, 79, 130,110, 68, 108, 91, 54,  85, 71, 38,  59, 47, 17,  18,  7,  0, 
224,187, 93, 199,166, 83, 176,148, 73, 152,128, 62, 129,109, 51, 108, 90, 39,  85, 71, 25,  58, 46,  3,  16,  8,  0, 
226,186, 64, 200,165, 57, 177,147, 50, 153,127, 40, 130,108, 31, 108, 90, 19,  85, 70,  3,  58, 46,  0,  16,  8,  0, 
227,185, 35, 200,165, 30, 176,146, 25, 152,127, 18, 130,108,  7, 108, 89,  0,  85, 70,  0,  57, 46,  0,  14,  8,  0, 
216,169,205, 192,150,184, 171,134,164, 149,116,144, 128, 99,124, 107, 81,103,  85, 63, 81,  60, 39, 55,  26,  0, 15, 
217,168,186, 193,150,165, 172,134,149, 150,116,130, 128, 99,111, 107, 81, 92,  85, 62, 72,  59, 39, 47,  25,  0,  6, 
219,168,168, 194,149,150, 173,133,135, 150,116,117, 128, 98, 99, 107, 80, 82,  86, 62, 63,  59, 38, 39,  24,  0,  0, 
219,166,148, 195,149,133, 173,133,119, 150,115,103, 128, 98, 88, 107, 80, 72,  85, 61, 54,  59, 38, 32,  23,  0,  0, 
220,166,129, 196,148,116, 174,132,103, 151,114, 89, 129, 97, 75, 107, 79, 60,  85, 61, 44,  59, 38, 22,  21,  0,  0, 
222,164,110, 197,147, 99, 175,131, 87, 151,113, 75, 129, 96, 63, 107, 79, 49,  85, 61, 33,  58, 38, 12,  19,  0,  0, 
222,164, 88, 197,146, 79, 174,130, 69, 151,113, 58, 129, 95, 47, 107, 78, 35,  85, 60, 20,  58, 38,  0,  18,  0,  0, 
223,164, 63, 198,145, 55, 175,129, 48, 151,112, 39, 129, 95, 29, 107, 78, 16,  85, 60,  1,  58, 38,  0,  17,  0,  0, 
223,163, 36, 198,145, 32, 174,129, 26, 151,111, 17, 129, 95,  7, 107, 78,  0,  84, 60,  0,  57, 37,  0,  15,  0,  0, 
215,147,192, 191,130,172, 170,116,153, 148,100,133, 127, 85,115, 107, 69, 96,  85, 51, 75,  60, 28, 50,  25,  0,  8, 
217,146,173, 192,130,154, 171,115,138, 149,100,121, 128, 84,103, 107, 68, 85,  85, 51, 66,  60, 28, 42,  25,  0,  0, 
217,145,157, 193,129,140, 173,115,125, 149,100,109, 128, 84, 92, 107, 68, 76,  85, 51, 58,  59, 28, 35,  23,  0,  0, 
218,145,140, 193,129,125, 172,114,110, 149, 99, 96, 128, 83, 81, 107, 67, 65,  84, 51, 49,  59, 29, 27,  22,  0,  0, 
219,144,121, 194,128,108, 172,113, 96, 149, 98, 83, 128, 83, 69, 107, 68, 55,  85, 50, 40,  59, 28, 18,  20,  0,  0, 
220,143,104, 195,128, 93, 173,114, 82, 150, 98, 69, 127, 82, 58, 107, 67, 45,  85, 50, 30,  59, 28,  7,  19,  0,  0, 
220,143, 84, 195,127, 74, 173,113, 65, 149, 97, 55, 128, 82, 44, 106, 67, 32,  84, 50, 16,  58, 28,  0,  18,  0,  0, 
221,142, 62, 196,126, 53, 173,112, 46, 150, 97, 37, 128, 82, 26, 107, 66, 14,  84, 50,  0,  58, 28,  0,  16,  0,  0, 
222,142, 38, 196,126, 34, 174,112, 27, 150, 96, 17, 128, 82,  6, 106, 66,  0,  84, 50,  0,  57, 29,  0,  16,  0,  0, 
214,123,179, 191,110,159, 169, 98,143, 147, 84,124, 126, 70,106, 107, 55, 88,  85, 39, 69,  60, 15, 45,  23,  0,  2, 
216,123,161, 192,110,144, 170, 98,129, 148, 84,112, 127, 70, 95, 107, 55, 79,  85, 39, 61,  60, 15, 37,  20,  0,  0, 
217,122,145, 192,110,130, 170, 97,116, 149, 84,101, 127, 70, 85, 106, 55, 70,  85, 39, 53,  59, 16, 30,  19,  0,  0, 
217,123,131, 192,109,116, 171, 96,103, 149, 83, 89, 127, 70, 75, 106, 55, 60,  85, 40, 45,  59, 16, 23,  17,  0,  0, 
217,122,114, 193,109,101, 172, 96, 91, 149, 82, 77, 128, 69, 64, 106, 55, 50,  84, 39, 35,  59, 17, 14,  17,  0,  0, 
218,122, 98, 194,108, 87, 171, 96, 77, 149, 82, 65, 127, 69, 52, 106, 55, 40,  84, 40, 25,  59, 18,  3,  15,  0,  0, 
219,122, 80, 193,108, 70, 172, 95, 61, 149, 82, 51, 127, 69, 40, 106, 55, 28,  84, 39, 12,  58, 17,  0,  13,  0,  0, 
219,121, 59, 194,108, 52, 172, 96, 44, 149, 82, 35, 127, 68, 24, 106, 55, 11,  84, 40,  0,  57, 18,  0,  13,  0,  0, 
219,121, 40, 193,108, 33, 172, 95, 26, 149, 81, 19, 128, 68,  6, 106, 54,  0,  84, 39,  0,  57, 18,  0,  13,  0,  0, 
213, 99,165, 189, 87,148, 169, 76,132, 147, 64,115, 126, 52, 98, 106, 39, 81,  85, 23, 63,  60,  0, 39,  16,  0,  0, 
214, 98,149, 191, 87,133, 170, 76,119, 148, 65,103, 127, 53, 88, 106, 39, 72,  85, 24, 55,  60,  0, 32,  15,  0,  0, 
215, 99,136, 191, 87,121, 170, 77,108, 148, 65, 93, 126, 53, 79, 106, 40, 64,  85, 24, 47,  59,  0, 25,  14,  0,  0, 
215, 99,121, 192, 87,108, 170, 77, 96, 148, 65, 82, 126, 53, 69, 106, 40, 55,  85, 25, 39,  59,  0, 18,  13,  0,  0, 
216, 99,106, 191, 87, 95, 170, 76, 83, 148, 65, 71, 126, 53, 58, 106, 41, 45,  85, 26, 30,  59,  0,  8,  11,  0,  0, 
216, 98, 91, 192, 88, 82, 170, 77, 71, 148, 65, 60, 127, 53, 48, 105, 41, 36,  83, 26, 21,  58,  1,  2,  11,  0,  0, 
217, 99, 75, 192, 87, 66, 170, 76, 57, 148, 65, 47, 126, 53, 36, 105, 41, 24,  83, 26,  8,  57,  2,  0,   9,  0,  0, 
217, 98, 57, 192, 87, 49, 171, 77, 41, 147, 65, 32, 126, 53, 21, 105, 41,  8,  84, 27,  0,  57,  3,  0,   9,  0,  0, 
217, 98, 40, 193, 87, 34, 171, 76, 27, 148, 65, 19, 126, 53,  6, 105, 41,  0,  83, 27,  0,  57,  4,  0,   9,  0,  0, 
211, 67,152, 189, 58,136, 168, 50,122, 147, 39,105, 127, 28, 89, 106, 14, 74,  85,  0, 56,  59,  0, 33,   9,  0,  0, 
213, 68,138, 190, 59,123, 169, 51,109, 148, 40, 95, 126, 30, 80, 106, 16, 65,  85,  0, 48,  59,  0, 27,   9,  0,  0, 
214, 69,125, 190, 59,111, 168, 51, 99, 148, 41, 86, 126, 31, 72, 106, 18, 58,  85,  0, 41,  59,  0, 20,   7,  0,  0, 
215, 70,112, 190, 61,100, 169, 52, 88, 147, 42, 76, 126, 32, 63, 106, 19, 49,  84,  1, 34,  58,  0, 13,   7,  0,  0, 
214, 70, 99, 190, 62, 88, 169, 53, 77, 147, 43, 65, 125, 32, 53, 106, 20, 40,  84,  3, 26,  58,  0,  4,   7,  0,  0, 
214, 71, 86, 190, 61, 75, 169, 53, 65, 146, 43, 54, 126, 33, 44, 105, 21, 31,  83,  4, 17,  57,  0,  0,   7,  0,  0, 
215, 71, 71, 191, 62, 62, 169, 53, 53, 147, 44, 44, 126, 34, 33, 105, 22, 20,  83,  5,  4,  57,  0,  0,   7,  0,  0, 
215, 71, 54, 191, 62, 47, 169, 54, 39, 147, 44, 30, 126, 35, 20, 105, 23,  6,  83,  6,  0,  56,  0,  0,   5,  0,  0, 
215, 71, 41, 191, 63, 34, 170, 54, 27, 147, 45, 17, 126, 35,  6, 105, 23,  0,  83,  8,  0,  56,  0,  0,   5,  0,  0, 
210, 13,140, 189,  1,125, 167,  0,110, 146,  0, 96, 126,  0, 81, 106,  0, 67,  85,  0, 51,  59,  0, 28,   4,  0,  0, 
212, 18,126, 190,  7,113, 168,  0,100, 146,  0, 86, 126,  0, 73, 106,  0, 59,  84,  0, 43,  59,  0, 22,   4,  0,  0, 
212, 21,115, 190, 13,103, 168,  3, 91, 146,  0, 78, 125,  0, 65, 105,  0, 52,  84,  0, 36,  58,  0, 16,   4,  0,  0, 
213, 24,103, 189, 19, 91, 168,  9, 82, 146,  0, 69, 125,  0, 57, 105,  0, 44,  84,  0, 29,  58,  0,  7,   4,  0,  0, 
213, 27, 92, 188, 21, 81, 168, 14, 71, 146,  1, 59, 125,  0, 48, 105,  0, 36,  84,  0, 21,  58,  0,  4,   4,  0,  0, 
213, 30, 80, 189, 22, 69, 168, 17, 61, 146,  5, 50, 125,  0, 39, 104,  0, 27,  83,  0, 12,  57,  0,  0,   4,  0,  0, 
214, 30, 67, 189, 25, 57, 168, 20, 50, 146,  9, 40, 125,  0, 29, 104,  0, 17,  83,  0,  2,  56,  0,  0,   4,  0,  0, 
214, 32, 53, 189, 27, 44, 169, 20, 38, 146, 13, 28, 124,  2, 17, 104,  0,  4,  83,  0,  0,  56,  0,  0,   4,  0,  0, 
214, 33, 41, 190, 27, 33, 168, 23, 27, 146, 13, 18, 125,  3,  5, 105,  0,  0,  83,  0,  0,  56,  0,  0,   4,  0,  0, 
185,229,250, 164,204,223, 146,182,199, 127,158,174, 108,136,149,  89,113,125,  70, 90,100,  46, 62, 71,  10, 25, 33, 
189,227,225, 168,202,201, 148,181,179, 129,157,156, 109,135,134,  90,113,113,  70, 89, 90,  46, 62, 62,   8, 24, 25, 
192,226,202, 170,202,182, 151,179,162, 130,156,141, 110,133,121,  91,112,101,  71, 89, 80,  46, 61, 54,   7, 24, 19, 
194,224,179, 173,200,160, 153,178,144, 132,155,125, 112,133,107,  92,111, 89,  71, 88, 69,  46, 61, 45,   6, 23, 10, 
196,223,155, 174,198,139, 154,176,124, 132,153,107, 113,131, 91,  92,110, 75,  72, 87, 58,  47, 60, 37,   4, 23,  0, 
198,221,131, 175,197,117, 155,175,105, 133,152, 91, 113,130, 76,  92,109, 63,  72, 86, 47,  46, 60, 26,   3, 23,  0, 
200,220,104, 176,196, 94, 156,175, 84, 134,151, 72, 113,129, 59,  93,108, 47,  72, 85, 33,  46, 59, 13,   0, 23,  0, 
201,219, 73, 179,195, 65, 157,173, 57, 135,150, 48, 114,129, 39,  94,108, 28,  72, 85, 15,  47, 59,  0,   0, 22,  0, 
203,219, 42, 178,195, 37, 157,173, 32, 135,150, 26, 114,128, 16,  94,107,  6,  73, 85,  0,  46, 58,  0,   0, 22,  0, 
186,205,233, 165,183,209, 148,163,187, 128,142,163, 109,121,140,  91,101,118,  71, 80, 94,  48, 54, 66,  12, 15, 27, 
189,204,211, 169,182,189, 151,163,169, 131,141,147, 111,121,126,  92,101,105,  72, 79, 84,  48, 54, 58,  11, 15, 19, 
192,202,190, 171,181,170, 152,161,152, 131,141,133, 112,120,113,  93,100, 94,  72, 79, 74,  48, 53, 50,  10, 15, 11, 
195,201,169, 172,179,151, 153,160,135, 132,139,117, 113,119,100,  93, 99, 82,  72, 78, 64,  48, 53, 41,   9, 14,  3, 
195,200,146, 174,179,131, 154,159,117, 133,138,101, 113,118, 86,  93, 98, 70,  73, 77, 53,  48, 52, 32,   8, 15,  0, 
198,199,125, 175,177,111, 155,158,100, 133,137, 85, 113,117, 71,  93, 97, 57,  72, 77, 42,  47, 52, 22,   5, 14,  0, 
199,198,101, 176,177, 89, 155,157, 79, 134,136, 68, 113,116, 56,  94, 97, 44,  73, 76, 30,  47, 52, 10,   2, 15,  0, 
200,197, 72, 178,176, 63, 157,156, 56, 135,136, 46, 114,116, 37,  94, 96, 26,  73, 76, 11,  47, 51,  0,   0, 14,  0, 
201,197, 45, 177,175, 38, 156,155, 31, 135,135, 25, 114,115, 17,  94, 96,  5,  73, 75,  0,  46, 51,  0,   0, 14,  0, 
187,183,218, 167,165,197, 149,147,176, 129,127,153, 111,109,132,  92, 90,111,  73, 70, 89,  49, 46, 62,  15,  4, 22, 
190,183,197, 170,164,177, 151,146,159, 130,127,139, 112,109,119,  93, 90, 99,  72, 70, 78,  49, 45, 53,  14,  4, 15, 
192,182,179, 171,163,161, 153,145,144, 132,126,125, 113,108,107,  93, 89, 88,  73, 70, 69,  49, 45, 45,  13,  5,  6, 
195,181,159, 172,162,142, 152,145,127, 132,125,111, 113,107, 94,  93, 88, 77,  73, 69, 59,  48, 45, 37,  11,  5,  0, 
195,180,139, 173,161,124, 153,143,110, 133,125, 96, 113,106, 81,  94, 88, 66,  73, 68, 49,  49, 44, 28,   9,  6,  0, 
196,179,118, 174,160,106, 154,142, 94, 133,124, 81, 113,105, 68,  94, 87, 54,  73, 68, 39,  48, 44, 18,   5,  5,  0, 
197,178, 96, 176,159, 86, 155,141, 75, 134,123, 64, 114,105, 53,  94, 87, 40,  73, 68, 26,  48, 44,  5,   2,  6,  0, 
199,178, 70, 176,158, 62, 156,141, 54, 134,122, 44, 114,104, 35,  94, 86, 23,  73, 67,  8,  47, 44,  0,   2,  6,  0, 
199,177, 45, 178,158, 40, 156,140, 32, 135,122, 26, 114,104, 16,  94, 86,  4,  73, 67,  0,  47, 44,  0,   0,  7,  0, 
188,161,204, 168,144,183, 149,129,164, 130,112,144, 112, 95,123,  93, 78,103,  74, 60, 81,  50, 36, 56,  16,  0, 16, 
190,160,185, 170,144,165, 151,128,148, 132,111,130, 112, 95,110,  93, 78, 92,  74, 59, 72,  50, 36, 48,  16,  0,  8, 
192,160,167, 171,143,150, 153,128,134, 132,111,117, 112, 94,100,  94, 77, 82,  74, 59, 63,  50, 36, 40,  14,  0,  0, 
193,159,149, 172,143,134, 153,127,119, 133,110,103, 113, 94, 87,  93, 77, 72,  73, 59, 54,  50, 36, 32,  12,  0,  0, 
195,159,131, 173,142,117, 153,127,104, 132,110, 90, 113, 93, 76,  93, 76, 61,  74, 59, 45,  49, 36, 23,   9,  0,  0, 
196,158,113, 174,141,101, 155,126, 89, 133,109, 76, 113, 93, 64,  94, 76, 51,  74, 58, 35,  49, 36, 14,   6,  0,  0, 
197,157, 92, 174,141, 80, 154,125, 71, 134,108, 60, 114, 92, 50,  94, 75, 37,  73, 58, 22,  48, 36,  1,   5,  0,  0, 
197,157, 68, 175,140, 59, 155,124, 51, 134,108, 41, 113, 91, 32,  94, 75, 21,  73, 57,  5,  48, 35,  0,   5,  0,  0, 
198,156, 46, 176,140, 40, 155,124, 32, 134,107, 24, 114, 91, 14,  94, 75,  2,  73, 57,  0,  48, 36,  0,   3,  0,  0, 
189,140,191, 168,126,172, 150,112,154, 131, 97,134, 112, 82,115,  94, 66, 96,  74, 49, 75,  51, 25, 50,  12,  0, 10, 
191,139,173, 170,125,154, 152,111,138, 132, 96,121, 113, 81,103,  94, 66, 85,  74, 48, 66,  50, 26, 42,  12,  0,  1, 
192,139,157, 171,125,140, 152,111,125, 132, 96,109, 113, 81, 92,  94, 65, 76,  74, 48, 58,  50, 26, 35,   9,  0,  0, 
193,139,140, 172,124,125, 153,110,112, 133, 95, 96, 113, 80, 82,  94, 65, 66,  74, 49, 50,  50, 26, 28,   7,  0,  0, 
194,138,123, 172,123,109, 153,110, 97, 133, 95, 84, 113, 80, 70,  94, 65, 56,  74, 48, 40,  50, 26, 20,   6,  0,  0, 
194,138,105, 173,123, 94, 153,109, 83, 133, 94, 70, 112, 79, 59,  94, 64, 46,  74, 48, 31,  50, 26,  9,   4,  0,  0, 
196,138, 87, 174,122, 77, 153,109, 67, 133, 93, 56, 113, 79, 46,  94, 64, 34,  73, 48, 18,  49, 27,  0,   4,  0,  0, 
196,137, 65, 174,122, 57, 154,108, 49, 133, 93, 39, 113, 79, 29,  94, 64, 18,  74, 48,  3,  49, 27,  0,   2,  0,  0, 
197,137, 47, 175,122, 40, 155,108, 32, 133, 93, 23, 114, 79, 14,  94, 64,  1,  73, 48,  0,  48, 27,  0,   2,  0,  0, 
189,119,177, 168,106,159, 150, 94,142, 131, 81,124, 113, 67,107,  94, 53, 89,  74, 37, 69,  51, 11, 45,   6,  0,  3, 
191,119,161, 170,106,144, 152, 94,129, 132, 81,112, 113, 67, 96,  94, 53, 79,  74, 37, 61,  51, 13, 38,   6,  0,  0, 
192,119,146, 170,106,131, 152, 94,117, 132, 80,101, 112, 67, 85,  94, 53, 70,  74, 37, 53,  50, 14, 31,   4,  0,  0, 
192,119,131, 171,106,117, 153, 94,105, 132, 80, 89, 113, 67, 75,  94, 54, 61,  74, 38, 45,  51, 14, 23,   3,  0,  0, 
193,118,114, 171,106,102, 153, 93, 90, 132, 80, 78, 113, 67, 65,  94, 53, 52,  74, 37, 36,  50, 15, 16,   1,  0,  0, 
194,118, 99, 172,105, 89, 153, 93, 78, 132, 80, 66, 113, 67, 54,  94, 53, 42,  74, 38, 27,  50, 16,  5,   1,  0,  0, 
194,118, 82, 173,105, 72, 153, 93, 63, 132, 79, 53, 113, 67, 42,  94, 53, 30,  74, 38, 15,  49, 16,  0,   0,  0,  0, 
195,117, 63, 173,105, 55, 154, 93, 47, 133, 79, 37, 113, 66, 27,  94, 53, 15,  73, 38,  0,  48, 16,  0,   0,  0,  0, 
195,117, 46, 173,104, 39, 154, 92, 32, 133, 79, 22, 113, 66, 13,  94, 53,  0,  73, 38,  0,  48, 17,  0,   0,  0,  0, 
189, 96,166, 168, 85,147, 150, 74,132, 131, 62,115, 113, 51, 99,  94, 38, 82,  74, 21, 63,  51,  0, 40,   1,  0,  0, 
190, 96,150, 170, 85,133, 152, 75,119, 132, 63,104, 113, 51, 88,  94, 38, 72,  75, 22, 55,  51,  0, 33,   1,  0,  0, 
192, 96,137, 170, 85,121, 152, 74,108, 132, 64, 94, 113, 52, 79,  94, 39, 64,  74, 23, 48,  50,  0, 26,   0,  0,  0, 
192, 96,122, 171, 86,109, 152, 75, 96, 132, 63, 83, 113, 52, 69,  94, 39, 56,  74, 24, 41,  50,  0, 19,   0,  0,  0, 
193, 96,107, 171, 85, 96, 152, 75, 84, 132, 64, 72, 113, 52, 60,  94, 39, 47,  74, 24, 32,  50,  1, 10,   0,  0,  0, 
193, 96, 93, 172, 85, 82, 152, 75, 72, 133, 63, 61, 113, 51, 49,  94, 39, 37,  73, 25, 23,  49,  2,  2,   0,  0,  0, 
194, 96, 78, 172, 85, 68, 152, 75, 59, 132, 63, 49, 113, 52, 39,  94, 40, 26,  73, 25, 11,  48,  3,  0,   0,  0,  0, 
194, 96, 60, 173, 85, 52, 153, 75, 44, 132, 64, 35, 112, 52, 25,  94, 40, 12,  73, 26,  0,  48,  4,  0,   0,  0,  0, 
195, 96, 46, 173, 85, 38, 154, 74, 31, 133, 63, 22, 113, 52, 11,  93, 40,  0,  73, 26,  0,  47,  5,  0,   0,  0,  0, 
188, 67,153, 168, 58,137, 151, 49,122, 131, 39,106, 113, 28, 90,  94, 13, 75,  75,  0, 57,  51,  0, 35,   0,  0,  0, 
190, 68,138, 170, 59,123, 152, 50,110, 132, 41, 96, 113, 29, 80,  94, 16, 66,  75,  0, 49,  50,  0, 27,   0,  0,  0, 
191, 69,126, 170, 59,112, 151, 52,100, 132, 42, 86, 113, 30, 73,  95, 17, 58,  75,  0, 42,  50,  0, 21,   0,  0,  0, 
192, 70,113, 170, 61,100, 151, 52, 89, 132, 42, 77, 113, 31, 64,  94, 19, 50,  74,  1, 35,  50,  0, 14,   0,  0,  0, 
192, 70,100, 170, 62, 89, 151, 53, 77, 131, 43, 66, 112, 32, 54,  94, 20, 42,  74,  2, 27,  49,  0,  5,   0,  0,  0, 
192, 71, 87, 171, 61, 77, 152, 53, 67, 131, 44, 57, 112, 33, 45,  94, 21, 33,  74,  4, 19,  49,  0,  1,   0,  0,  0, 
193, 71, 74, 171, 62, 64, 152, 53, 55, 132, 44, 45, 113, 34, 34,  94, 22, 23,  73,  5,  7,  48,  0,  0,   0,  0,  0, 
193, 70, 58, 172, 62, 50, 152, 54, 42, 132, 44, 32, 112, 35, 22,  93, 23, 10,  73,  6,  0,  47,  0,  0,   0,  0,  0, 
193, 70, 45, 172, 62, 38, 153, 54, 31, 132, 44, 21, 112, 35,  9,  94, 23,  0,  73,  7,  0,  47,  0,  0,   0,  0,  0, 
189, 26,141, 169, 15,126, 150,  2,112, 131,  0, 97, 113,  0, 82,  94,  0, 67,  75,  0, 51,  50,  0, 29,   0,  0,  0, 
190, 28,128, 170, 18,114, 151,  8,101, 132,  0, 88, 113,  0, 74,  94,  0, 60,  75,  0, 44,  50,  0, 23,   0,  0,  0, 
191, 30,117, 170, 23,104, 152, 11, 92, 132,  1, 79, 113,  0, 67,  95,  0, 53,  75,  0, 37,  50,  0, 17,   0,  0,  0, 
191, 33,105, 170, 26, 93, 151, 18, 83, 132,  6, 70, 112,  0, 58,  94,  0, 45,  75,  0, 30,  49,  0,  8,   0,  0,  0, 
191, 34, 93, 170, 27, 82, 151, 20, 72, 131,  8, 61, 112,  0, 49,  94,  0, 38,  74,  0, 23,  49,  0,  4,   0,  0,  0, 
191, 36, 82, 170, 29, 71, 151, 22, 63, 131, 11, 52, 112,  0, 41,  93,  0, 29,  74,  0, 14,  48,  0,  1,   0,  0,  0, 
191, 38, 69, 170, 31, 60, 151, 24, 51, 131, 14, 41, 112,  1, 31,  93,  0, 19,  73,  0,  3,  48,  0,  0,   0,  0,  0, 
192, 37, 56, 171, 31, 47, 152, 25, 40, 131, 17, 30, 112,  4, 19,  93,  0,  7,  73,  0,  0,  47,  0,  0,   0,  0,  0, 
192, 38, 45, 171, 33, 36, 152, 26, 30, 131, 18, 21, 111,  7,  9,  93,  0,  0,  73,  0,  0,  47,  0,  0,   0,  0,  0, 
149,218,248, 133,194,222, 119,173,198, 102,151,173,  86,130,148,  70,108,125,  53, 85,100,  32, 59, 71,   0, 22, 33, 
154,216,223, 137,193,200, 122,172,178, 106,150,156,  89,128,133,  73,107,112,  54, 85, 89,  31, 59, 63,   0, 22, 26, 
159,215,202, 141,192,181, 126,171,161, 108,149,141,  90,128,121,  74,107,100,  55, 85, 80,  32, 58, 55,   0, 22, 19, 
161,213,179, 144,190,160, 126,170,143, 109,148,125,  92,127,107,  74,106, 89,  56, 84, 69,  32, 58, 46,   0, 21, 11, 
163,211,156, 144,189,139, 129,168,125, 110,147,108,  93,126, 92,  75,105, 76,  57, 83, 58,  33, 58, 37,   0, 21,  1, 
167,211,133, 147,188,120, 130,167,105, 110,145, 92,  93,125, 78,  76,104, 64,  58, 83, 48,  33, 57, 27,   0, 21,  0, 
169,210,108, 149,187, 96, 131,166, 86, 112,144, 74,  94,124, 62,  77,103, 49,  58, 82, 35,  33, 57, 15,   0, 21,  0, 
170,209, 80, 151,186, 71, 133,165, 62, 114,143, 52,  95,123, 42,  77,103, 32,  58, 81, 18,  33, 56,  0,   0, 21,  0, 
173,208, 55, 152,186, 49, 134,165, 41, 114,143, 34,  95,122, 25,  77,102, 14,  58, 81,  0,  33, 56,  0,   0, 21,  0, 
154,195,232, 137,174,207, 122,156,185, 105,136,163,  89,116,140,  73, 97,117,  56, 76, 94,  35, 51, 66,   0, 13, 28, 
158,194,209, 141,174,187, 125,155,167, 109,135,146,  91,116,125,  75, 96,105,  57, 75, 83,  35, 50, 57,   0, 12, 21, 
161,193,189, 144,173,169, 128,154,151, 110,134,132,  93,115,113,  77, 95, 94,  58, 75, 74,  35, 50, 50,   0, 12, 13, 
164,192,168, 145,171,151, 129,153,134, 111,133,117,  94,114,100,  76, 95, 82,  58, 75, 64,  36, 50, 42,   0, 12,  5, 
165,191,147, 147,170,131, 130,152,117, 113,132,102,  95,113, 86,  77, 94, 71,  58, 74, 54,  35, 50, 33,   0, 13,  0, 
167,189,126, 148,169,113, 132,151,100, 113,131, 86,  96,112, 73,  77, 93, 59,  59, 73, 43,  35, 49, 23,   0, 12,  0, 
170,189,104, 150,168, 91, 133,150, 81, 114,130, 69,  96,111, 57,  78, 92, 46,  59, 73, 31,  35, 49, 11,   0, 13,  0, 
171,188, 78, 152,168, 68, 134,149, 60, 115,130, 50,  96,111, 41,  78, 92, 29,  60, 73, 15,  35, 49,  0,   0, 12,  0, 
173,187, 55, 153,167, 47, 134,149, 39, 115,129, 33,  97,110, 24,  79, 92, 13,  60, 72,  0,  35, 48,  0,   0, 12,  0, 
157,175,217, 139,157,196, 125,141,175, 109,122,153,  92,104,132,  76, 86,110,  59, 67, 88,  37, 43, 61,   1,  1, 23, 
161,174,196, 144,156,176, 127,140,158, 110,121,137,  94,104,118,  77, 85, 98,  59, 67, 78,  37, 43, 53,   0,  2, 16, 
163,174,178, 146,156,160, 130,139,143, 112,121,124,  95,103,106,  78, 85, 88,  60, 66, 69,  37, 42, 46,   0,  2,  7, 
166,173,159, 147,154,142, 130,138,127, 113,120,111,  96,103, 95,  78, 84, 77,  60, 66, 59,  37, 43, 37,   0,  2,  0, 
166,172,139, 148,154,125, 131,137,112, 113,120, 96,  96,102, 81,  78, 84, 66,  60, 65, 50,  37, 42, 29,   0,  3,  0, 
167,171,120, 149,153,107, 133,137, 95, 114,118, 81,  97,101, 69,  79, 84, 56,  60, 65, 40,  37, 42, 19,   0,  3,  0, 
170,170, 99, 151,152, 87, 134,136, 77, 115,118, 66,  97,101, 55,  79, 83, 42,  61, 65, 28,  37, 42,  7,   0,  3,  0, 
172,170, 75, 152,151, 65, 134,135, 57, 115,117, 48,  97,100, 38,  79, 83, 27,  61, 64, 12,  36, 42,  0,   0,  3,  0, 
172,169, 55, 154,151, 46, 135,134, 40, 116,116, 32,  97, 99, 21,  80, 82, 10,  61, 64,  0,  36, 41,  0,   0,  3,  0, 
160,154,203, 143,139,182, 127,124,164, 111,107,143,  95, 91,122,  78, 75,103,  60, 57, 81,  39, 33, 56,   1,  0, 18, 
163,154,184, 146,138,165, 130,123,148, 113,107,129,  96, 90,110,  79, 74, 92,  61, 56, 72,  39, 34, 48,   2,  0,  9, 
165,154,167, 147,137,149, 131,122,134, 114,106,117,  96, 90,100,  79, 74, 82,  61, 56, 64,  39, 33, 40,   2,  0,  1, 
166,153,150, 149,137,133, 132,122,119, 114,106,104,  97, 90, 88,  79, 74, 72,  61, 56, 55,  39, 34, 33,   0,  0,  0, 
168,152,132, 149,136,117, 132,121,104, 114,105, 90,  97, 89, 76,  79, 73, 62,  61, 56, 46,  38, 34, 25,   0,  0,  0, 
169,151,114, 150,135,101, 133,121, 90, 114,104, 77,  97, 89, 65,  80, 73, 51,  61, 56, 36,  38, 34, 16,   0,  0,  0, 
170,150, 94, 151,135, 83, 134,120, 73, 115,104, 62,  98, 88, 51,  80, 72, 39,  61, 56, 24,  38, 34,  3,   0,  0,  0, 
172,150, 72, 153,134, 63, 135,119, 55, 115,103, 45,  98, 88, 36,  80, 72, 24,  61, 55,  9,  38, 34,  0,   0,  0,  0, 
172,150, 54, 153,134, 47, 135,119, 38, 116,103, 30,  98, 87, 21,  80, 72,  8,  62, 55,  0,  37, 34,  0,   0,  0,  0, 
162,134,190, 145,120,171, 129,108,153, 113, 93,134,  97, 78,115,  80, 63, 96,  62, 46, 75,  41, 23, 51,   0,  0, 11, 
165,134,173, 147,120,154, 131,107,138, 114, 92,120,  97, 78,103,  80, 63, 85,  62, 46, 66,  40, 23, 43,   0,  0,  2, 
166,134,157, 148,120,140, 132,106,125, 114, 92,109,  97, 77, 93,  81, 63, 77,  62, 46, 58,  40, 24, 36,   0,  0,  0, 
168,133,140, 149,119,125, 132,106,112, 115, 92, 97,  98, 77, 82,  81, 62, 67,  62, 46, 50,  40, 24, 29,   0,  0,  0, 
168,133,123, 150,119,110, 133,106, 97, 115, 91, 84,  98, 77, 70,  81, 62, 57,  62, 46, 41,  40, 24, 20,   0,  0,  0, 
169,132,107, 150,118, 94, 133,105, 84, 115, 91, 72,  98, 76, 60,  80, 62, 47,  62, 46, 32,  39, 25, 11,   0,  0,  0, 
171,132, 89, 152,118, 79, 135,105, 69, 115, 90, 58,  98, 76, 47,  80, 62, 36,  62, 46, 21,  39, 25,  0,   0,  0,  0, 
171,132, 69, 153,117, 60, 135,104, 52, 116, 90, 42,  98, 76, 33,  81, 61, 21,  62, 46,  6,  38, 25,  0,   0,  0,  0, 
172,132, 54, 153,118, 45, 135,104, 38, 116, 90, 28,  98, 76, 18,  81, 61,  6,  62, 46,  0,  38, 25,  0,   0,  0,  0, 
164,115,177, 146,103,159, 130, 91,143, 114, 78,125,  97, 65,107,  81, 51, 89,  63, 34, 69,  41,  9, 46,   0,  0,  4, 
166,115,161, 148,103,144, 132, 91,129, 115, 78,112,  98, 65, 96,  81, 51, 79,  63, 35, 61,  41, 11, 38,   0,  0,  0, 
167,115,146, 150,102,131, 132, 91,117, 115, 78,101,  98, 65, 86,  81, 51, 71,  63, 35, 54,  41, 12, 32,   0,  0,  0, 
168,114,132, 150,103,118, 133, 91,105, 116, 78, 91,  98, 64, 76,  82, 51, 61,  63, 36, 46,  41, 13, 24,   0,  0,  0, 
169,114,116, 150,102,103, 134, 90, 91, 116, 78, 79,  98, 65, 66,  81, 51, 53,  63, 36, 37,  40, 14, 17,   0,  0,  0, 
169,114,101, 151,101, 89, 134, 90, 79, 116, 77, 67,  98, 64, 56,  81, 51, 44,  63, 36, 29,  40, 15,  7,   0,  0,  0, 
170,114, 85, 152,101, 75, 135, 90, 65, 116, 77, 54,  98, 64, 44,  81, 51, 32,  63, 36, 17,  39, 15,  0,   0,  0,  0, 
172,113, 66, 152,101, 58, 135, 89, 49, 116, 77, 40,  99, 64, 30,  81, 51, 18,  62, 36,  3,  38, 16,  0,   0,  0,  0, 
171,113, 51, 153,101, 44, 136, 89, 36, 116, 77, 28,  99, 64, 18,  81, 51,  5,  62, 36,  0,  38, 16,  0,   0,  0,  0, 
165, 94,166, 147, 82,147, 132, 72,132, 115, 61,115,  98, 49, 99,  82, 36, 82,  64, 19, 64,  42,  0, 41,   0,  0,  0, 
167, 93,150, 150, 83,134, 133, 73,120, 116, 62,104,  99, 49, 88,  82, 36, 72,  64, 20, 55,  41,  0, 33,   0,  0,  0, 
169, 93,137, 150, 83,122, 134, 73,109, 116, 61, 94,  99, 50, 80,  82, 37, 65,  64, 21, 49,  41,  0, 27,   0,  0,  0, 
169, 94,123, 150, 83,110, 133, 73, 97, 116, 61, 83,  99, 50, 70,  82, 38, 57,  63, 23, 42,  41,  0, 20,   0,  0,  0, 
169, 94,109, 150, 84, 97, 134, 73, 85, 116, 62, 73,  99, 51, 61,  81, 38, 48,  63, 23, 33,  41,  1, 11,   0,  0,  0, 
170, 94, 96, 150, 83, 84, 134, 73, 74, 116, 61, 62,  99, 50, 51,  82, 38, 39,  64, 23, 24,  40,  3,  4,   0,  0,  0, 
171, 93, 79, 152, 82, 70, 135, 73, 61, 116, 62, 51,  98, 51, 40,  81, 38, 28,  63, 24, 14,  39,  4,  0,   0,  0,  0, 
171, 94, 64, 152, 83, 55, 135, 73, 47, 116, 62, 37,  98, 50, 27,  81, 38, 15,  63, 24,  1,  39,  4,  0,   0,  0,  0, 
172, 93, 51, 153, 82, 42, 135, 73, 35, 117, 62, 26,  99, 51, 16,  81, 39,  3,  63, 25,  0,  38,  5,  0,   0,  0,  0, 
166, 68,153, 148, 59,137, 133, 49,121, 115, 39,106,  99, 28, 91,  82, 13, 75,  65,  0, 58,  42,  0, 36,   0,  0,  0, 
168, 68,139, 150, 59,124, 134, 50,110, 116, 40, 96,  99, 30, 81,  82, 16, 66,  64,  0, 50,  41,  0, 29,   0,  0,  0, 
169, 69,126, 150, 59,113, 134, 51,101, 117, 42, 87, 100, 30, 73,  82, 17, 59,  65,  0, 43,  41,  0, 23,   0,  0,  0, 
169, 70,115, 150, 61,102, 134, 52, 89, 116, 42, 77,  99, 32, 65,  82, 19, 52,  64,  0, 36,  41,  0, 15,   0,  0,  0, 
169, 70,101, 150, 61, 90, 134, 52, 79, 116, 43, 68,  99, 32, 55,  82, 21, 43,  64,  2, 28,  41,  0,  6,   0,  0,  0, 
170, 70, 89, 151, 62, 79, 134, 53, 69, 116, 44, 58,  99, 33, 46,  81, 21, 34,  64,  3, 20,  41,  0,  2,   0,  0,  0, 
170, 71, 76, 152, 62, 66, 134, 53, 57, 116, 43, 46,  99, 33, 36,  82, 22, 24,  64,  5, 10,  40,  0,  0,   0,  0,  0, 
171, 70, 61, 152, 62, 52, 135, 53, 44, 116, 44, 35,  99, 34, 24,  82, 22, 12,  63,  6,  0,  39,  0,  0,   0,  0,  0, 
171, 71, 49, 153, 62, 41, 135, 54, 33, 117, 45, 25,  98, 34, 13,  81, 23,  0,  63,  7,  0,  39,  0,  0,   0,  0,  0, 
167, 33,142, 149, 24,127, 134, 10,113, 116,  0, 97, 100,  0, 83,  83,  0, 68,  65,  0, 52,  40,  0, 30,   0,  0,  0, 
169, 33,129, 150, 26,115, 134, 17,102, 116,  3, 89, 100,  0, 75,  83,  0, 60,  65,  0, 45,  40,  0, 24,   0,  0,  0, 
169, 36,118, 151, 27,104, 134, 19, 93, 116,  7, 80, 100,  0, 67,  83,  0, 54,  65,  0, 38,  41,  0, 17,   0,  0,  0, 
169, 39,107, 150, 30, 94, 134, 22, 84, 116, 11, 71,  99,  0, 59,  83,  0, 46,  64,  0, 31,  40,  0,  9,   0,  0,  0, 
169, 39, 95, 151, 31, 83, 134, 24, 73, 116, 15, 62, 100,  1, 51,  83,  0, 38,  64,  0, 24,  40,  0,  5,   0,  0,  0, 
169, 41, 83, 151, 33, 73, 134, 26, 64, 117, 17, 54,  99,  4, 42,  82,  0, 30,  64,  0, 16,  40,  0,  1,   0,  0,  0, 
170, 42, 71, 152, 34, 62, 134, 28, 53, 117, 19, 44,  99,  6, 33,  82,  0, 21,  63,  0,  4,  39,  0,  0,   0,  0,  0, 
171, 42, 59, 152, 35, 50, 134, 29, 42, 117, 21, 32,  99,  9, 22,  82,  0,  9,  63,  0,  0,  38,  0,  0,   0,  0,  0, 
172, 42, 48, 152, 36, 40, 135, 29, 32, 117, 21, 23,  99, 10, 12,  82,  0,  0,  63,  0,  0,  38,  0,  0,   0,  0,  0, 
107,207,246,  96,185,220,  86,165,196,  73,144,171,  60,123,147,  46,103,125,  32, 82,100,   9, 56, 71,   0, 20, 33, 
115,206,221, 104,184,198,  92,164,178,  78,143,154,  64,123,133,  51,102,111,  34, 81, 89,  10, 56, 63,   0, 20, 27, 
122,204,200, 108,183,180,  95,163,161,  82,142,140,  68,122,120,  54,102,101,  36, 81, 79,  11, 56, 55,   0, 20, 20, 
125,203,179, 111,181,160,  97,162,143,  85,141,124,  70,121,107,  55,101, 89,  38, 80, 69,  14, 55, 46,   0, 19, 10, 
128,202,156, 113,180,140, 102,161,125,  87,140,108,  71,120, 92,  56,100, 76,  39, 79, 59,  14, 55, 38,   0, 20,  3, 
132,200,135, 117,179,121, 103,159,106,  88,139, 93,  73,119, 79,  57,100, 65,  41, 79, 49,  15, 54, 28,   0, 19,  0, 
134,200,111, 119,178, 98, 105,158, 87,  89,138, 76,  74,118, 64,  58, 99, 51,  41, 78, 37,  16, 54, 17,   0, 19,  0, 
137,199, 85, 122,177, 75, 108,158, 66,  91,137, 56,  75,118, 46,  59, 98, 35,  42, 78, 22,  16, 54,  3,   0, 19,  0, 
140,198, 62, 125,177, 55, 109,158, 47,  92,137, 40,  76,117, 32,  59, 98, 21,  42, 78,  6,  16, 54,  0,   0, 18,  0, 
118,186,231, 106,167,206,  93,149,184,  81,130,161,  67,111,139,  54, 92,117,  39, 72, 93,  17, 48, 66,   0, 10, 29, 
123,185,207, 110,166,186,  98,148,167,  85,129,145,  71,111,125,  56, 92,104,  40, 72, 83,  18, 48, 57,   0, 10, 22, 
128,184,188, 113,165,168, 102,147,151,  88,128,131,  73,110,113,  58, 91, 94,  42, 71, 74,  19, 48, 50,   0,  9, 15, 
131,183,168, 116,164,151, 104,146,134,  89,127,117,  73,109,100,  58, 90, 83,  42, 71, 65,  20, 48, 42,   0,  9,  5, 
134,182,148, 120,163,131, 105,145,118,  90,126,102,  75,108, 86,  59, 90, 72,  43, 71, 55,  19, 47, 34,   0,  9,  0, 
136,181,128, 122,162,115, 107,144,102,  92,125, 87,  76,107, 74,  61, 89, 60,  44, 70, 45,  20, 47, 24,   0,  8,  0, 
139,180,106, 124,161, 95, 109,144, 83,  93,124, 71,  77,107, 60,  61, 89, 47,  44, 70, 33,  20, 47, 13,   0,  8,  0, 
142,179, 82, 125,160, 72, 111,143, 63,  94,124, 54,  77,106, 44,  61, 88, 32,  44, 69, 18,  20, 46,  0,   0,  8,  0, 
143,179, 62, 127,160, 54, 111,142, 47,  94,124, 39,  78,106, 29,  62, 88, 18,  45, 69,  3,  20, 46,  0,   0,  8,  0, 
124,167,216, 112,150,194,  99,134,174,  87,117,153,  73,100,131,  58, 82,110,  43, 64, 88,  23, 40, 61,   0,  0, 24, 
129,166,195, 116,150,175, 103,134,158,  89,116,137,  75, 99,118,  60, 82, 98,  44, 63, 78,  23, 40, 53,   0,  0, 17, 
132,166,177, 119,149,160, 106,133,143,  90,115,124,  76, 99,107,  61, 81, 88,  45, 63, 69,  24, 40, 46,   0,  0,  9, 
136,166,159, 121,148,143, 107,132,126,  92,115,111,  77, 98, 94,  62, 81, 78,  46, 63, 60,  23, 40, 38,   0,  0,  0, 
138,164,140, 122,147,125, 108,131,111,  93,114, 97,  79, 98, 82,  63, 80, 67,  46, 62, 50,  24, 40, 29,   0,  0,  0, 
139,163,122, 124,146,109, 110,131, 96,  94,114, 83,  79, 97, 70,  63, 81, 57,  46, 62, 41,  24, 40, 21,   0,  0,  0, 
141,163,101, 126,145, 90, 111,130, 79,  95,113, 68,  79, 96, 56,  63, 80, 44,  47, 62, 30,  23, 40, 10,   0,  0,  0, 
144,162, 79, 127,145, 70, 112,129, 60,  95,112, 51,  79, 96, 41,  64, 79, 30,  47, 61, 15,  23, 40,  0,   0,  0,  0, 
145,162, 60, 129,145, 52, 113,129, 46,  96,112, 37,  79, 95, 27,  64, 79, 16,  47, 61,  1,  23, 39,  0,   0,  0,  0, 
131,147,202, 117,133,181, 105,119,162,  91,103,142,  77, 87,122,  62, 71,102,  47, 54, 81,  26, 31, 56,   0,  0, 18, 
135,147,183, 120,132,164, 107,118,147,  93,102,128,  78, 87,110,  63, 71, 92,  47, 54, 72,  26, 31, 48,   0,  0, 10, 
138,147,166, 123,131,149, 108,118,133,  94,102,116,  79, 86,100,  64, 71, 82,  48, 54, 64,  27, 31, 41,   0,  0,  2, 
139,146,149, 124,131,134, 111,117,119,  94,101,103,  79, 86, 88,  64, 70, 72,  48, 53, 55,  27, 31, 33,   0,  0,  0, 
141,146,132, 125,131,117, 111,117,104,  95,101, 91,  80, 86, 77,  65, 70, 62,  48, 53, 46,  26, 31, 25,   0,  0,  0, 
143,145,115, 126,130,101, 112,116, 90,  96,100, 78,  80, 85, 65,  65, 70, 52,  49, 53, 37,  27, 32, 17,   0,  0,  0, 
144,144, 96, 128,129, 85, 112,115, 75,  97,100, 64,  81, 85, 52,  65, 69, 40,  49, 53, 26,  26, 31,  5,   0,  0,  0, 
146,144, 76, 129,129, 67, 114,115, 58,  97, 99, 48,  82, 84, 38,  66, 69, 27,  49, 53, 12,  26, 32,  0,   0,  0,  0, 
146,144, 59, 130,128, 51, 114,114, 43,  98, 99, 35,  82, 84, 25,  66, 69, 13,  49, 53,  0,  26, 32,  0,   0,  0,  0, 
135,129,189, 122,115,170, 107,103,152,  94, 89,133,  79, 74,114,  64, 60, 95,  49, 43, 75,  29, 20, 51,   0,  0, 12, 
138,129,171, 124,115,153, 110,103,138,  95, 89,120,  81, 74,103,  66, 60, 86,  50, 44, 67,  28, 21, 43,   0,  0,  3, 
140,129,156, 125,115,140, 111,103,125,  96, 89,109,  81, 74, 93,  67, 60, 76,  50, 44, 59,  29, 22, 36,   0,  0,  0, 
142,128,140, 127,115,125, 112,102,112,  97, 88, 97,  82, 74, 83,  67, 60, 67,  50, 44, 51,  29, 22, 29,   0,  0,  0, 
142,128,124, 127,114,111, 113,102, 98,  98, 88, 85,  82, 74, 71,  66, 60, 58,  50, 44, 42,  29, 22, 21,   0,  0,  0, 
144,127,108, 128,114, 96, 113,101, 85,  98, 87, 73,  82, 74, 61,  67, 60, 48,  50, 44, 33,  28, 23, 12,   0,  0,  0, 
145,127, 91, 129,114, 81, 115,101, 71,  98, 87, 60,  82, 73, 48,  67, 59, 37,  50, 44, 22,  29, 23,  1,   0,  0,  0, 
147,127, 73, 130,113, 63, 115,101, 55,  98, 87, 45,  83, 73, 35,  67, 59, 24,  50, 44, 10,  28, 24,  0,   0,  0,  0, 
147,127, 58, 131,113, 49, 115,100, 42,  99, 86, 33,  83, 73, 23,  67, 59, 10,  50, 44,  0,  27, 24,  0,   0,  0,  0, 
138,110,177, 124, 99,159, 110, 88,142,  96, 75,125,  82, 62,107,  66, 48, 89,  51, 33, 70,  30,  8, 46,   0,  0,  5, 
142,111,160, 127, 99,144, 113, 88,130,  98, 75,112,  82, 62, 96,  68, 49, 80,  51, 33, 61,  30, 10, 39,   0,  0,  0, 
143,111,146, 128, 99,131, 114, 88,118,  98, 75,101,  83, 62, 86,  68, 49, 71,  52, 33, 54,  30, 11, 32,   0,  0,  0, 
144,111,132, 128, 99,118, 113, 88,106,  99, 75, 91,  83, 62, 77,  68, 49, 62,  52, 34, 46,  30, 12, 25,   0,  0,  0, 
144,111,117, 129, 98,104, 114, 87, 92,  99, 75, 80,  83, 62, 67,  68, 49, 53,  51, 34, 38,  30, 13, 18,   0,  0,  0, 
145,111,103, 130, 98, 91, 114, 87, 80,  99, 75, 68,  83, 63, 57,  68, 50, 45,  51, 34, 30,  30, 14,  8,   0,  0,  0, 
146,110, 87, 131, 98, 76, 115, 87, 67,  99, 75, 56,  83, 62, 45,  68, 49, 33,  52, 35, 19,  30, 15,  2,   0,  0,  0, 
148,110, 70, 131, 98, 60, 116, 86, 52,  99, 74, 43,  84, 62, 33,  69, 49, 21,  52, 35,  6,  29, 15,  0,   0,  0,  0, 
148,110, 56, 132, 97, 48, 117, 87, 40, 100, 75, 31,  84, 62, 22,  68, 49,  9,  51, 35,  0,  28, 15,  0,   0,  0,  0, 
142, 91,166, 126, 80,148, 113, 71,132,  98, 59,115,  83, 47, 99,  69, 34, 82,  53, 17, 64,  32,  0, 41,   0,  0,  0, 
143, 91,150, 128, 81,135, 114, 71,120,  99, 60,104,  85, 48, 89,  69, 35, 73,  53, 19, 56,  32,  0, 34,   0,  0,  0, 
145, 91,137, 129, 81,122, 115, 71,109, 100, 60, 94,  85, 48, 81,  69, 35, 65,  53, 19, 49,  32,  0, 28,   0,  0,  0, 
146, 92,124, 130, 81,110, 115, 71, 98, 100, 60, 84,  85, 49, 71,  69, 36, 57,  53, 21, 42,  32,  0, 21,   0,  0,  0, 
147, 91,110, 130, 81, 97, 115, 71, 86, 100, 60, 74,  84, 49, 62,  69, 36, 48,  53, 22, 34,  32,  0, 13,   0,  0,  0, 
147, 92, 97, 130, 81, 85, 116, 72, 76, 100, 60, 63,  85, 49, 52,  69, 37, 40,  53, 22, 26,  31,  1,  5,   0,  0,  0, 
148, 92, 82, 131, 81, 71, 116, 71, 62, 100, 60, 53,  84, 49, 42,  69, 37, 30,  52, 23, 16,  31,  2,  0,   0,  0,  0, 
148, 91, 67, 132, 81, 57, 117, 71, 49, 100, 60, 39,  84, 49, 30,  69, 37, 18,  52, 23,  2,  30,  2,  0,   0,  0,  0, 
149, 91, 54, 132, 81, 46, 118, 71, 39, 101, 60, 29,  85, 49, 19,  69, 37,  6,  52, 23,  0,  29,  3,  0,   0,  0,  0, 
143, 68,153, 128, 59,137, 115, 49,122,  99, 39,107,  85, 28, 91,  70, 13, 75,  54,  0, 58,  32,  0, 36,   0,  0,  0, 
146, 68,140, 131, 59,125, 116, 51,111, 100, 40, 97,  85, 29, 82,  70, 15, 67,  54,  0, 50,  32,  0, 29,   0,  0,  0, 
147, 68,127, 131, 59,114, 117, 51,102, 101, 41, 88,  86, 30, 74,  70, 17, 60,  54,  0, 44,  32,  0, 23,   0,  0,  0, 
147, 70,115, 131, 60,103, 116, 52, 91, 100, 42, 78,  85, 32, 65,  70, 19, 53,  54,  1, 38,  32,  0, 17,   0,  0,  0, 
147, 70,103, 131, 61, 91, 117, 53, 81, 101, 43, 69,  86, 32, 57,  70, 20, 44,  54,  2, 30,  32,  0,  7,   0,  0,  0, 
148, 70, 91, 132, 61, 80, 117, 52, 70, 101, 43, 59,  85, 33, 48,  70, 21, 36,  53,  4, 22,  32,  0,  3,   0,  0,  0, 
148, 70, 78, 132, 62, 68, 117, 53, 58, 101, 43, 48,  85, 34, 38,  70, 22, 26,  53,  6, 12,  31,  0,  0,   0,  0,  0, 
149, 71, 64, 132, 62, 54, 118, 54, 46, 101, 44, 37,  85, 34, 27,  69, 23, 15,  53,  7,  1,  30,  0,  0,   0,  0,  0, 
150, 70, 53, 134, 61, 44, 118, 54, 36, 101, 44, 28,  85, 35, 17,  69, 23,  4,  52,  8,  0,  30,  0,  0,   0,  0,  0, 
145, 38,143, 130, 29,128, 117, 18,114, 101,  3, 98,  87,  0, 84,  72,  0, 69,  54,  0, 53,  30,  0, 31,   0,  0,  0, 
147, 38,130, 132, 30,116, 117, 22,103, 101,  8, 89,  87,  0, 76,  72,  0, 62,  54,  0, 46,  30,  0, 24,   0,  0,  0, 
148, 40,119, 132, 31,105, 117, 23, 94, 101, 13, 81,  87,  0, 68,  71,  0, 55,  54,  0, 39,  30,  0, 18,   0,  0,  0, 
148, 42,108, 132, 34, 96, 117, 25, 85, 102, 15, 73,  86,  2, 60,  71,  0, 47,  54,  0, 33,  30,  0, 11,   0,  0,  0, 
148, 43, 96, 133, 35, 85, 117, 28, 75, 102, 18, 64,  87,  5, 52,  71,  0, 40,  54,  0, 25,  30,  0,  5,   0,  0,  0, 
149, 44, 85, 132, 36, 75, 118, 29, 66, 101, 20, 55,  86,  8, 44,  70,  0, 32,  53,  0, 18,  29,  0,  2,   0,  0,  0, 
149, 45, 74, 133, 37, 64, 118, 31, 55, 102, 21, 45,  85, 10, 34,  70,  0, 22,  53,  0,  6,  28,  0,  0,   0,  0,  0, 
150, 46, 61, 133, 39, 52, 118, 31, 44, 102, 23, 34,  85, 12, 24,  70,  0, 12,  52,  0,  0,  28,  0,  0,   0,  0,  0, 
150, 46, 51, 133, 40, 42, 119, 32, 35, 102, 24, 25,  85, 13, 14,  70,  0,  1,  52,  0,  0,  27,  0,  0,   0,  0,  0, 
 53,198,244,  49,177,218,  41,158,195,  32,138,171,  22,118,147,  11, 98,124,   0, 78,100,   0, 54, 71,   0, 18, 34, 
 69,196,220,  64,175,196,  54,157,176,  45,137,154,  32,117,133,  19, 98,111,   0, 78, 89,   0, 53, 63,   0, 17, 27, 
 80,195,198,  69,175,179,  60,156,159,  50,136,139,  38,116,120,  25, 98,101,   4, 77, 80,   0, 53, 55,   0, 17, 21, 
 84,193,177,  75,173,159,  64,155,142,  55,135,124,  41,116,107,  27, 97, 89,   9, 76, 70,   0, 53, 47,   0, 17, 11, 
 89,193,157,  79,172,140,  70,154,125,  57,134,109,  44,115, 92,  32, 96, 76,  13, 76, 59,   0, 52, 39,   0, 16,  4, 
 94,191,135,  85,171,121,  72,152,108,  60,133, 94,  47,114, 80,  32, 95, 65,  15, 76, 49,   0, 52, 29,   0, 16,  0, 
 98,190,113,  87,170,100,  76,152, 89,  62,132, 77,  49,113, 65,  35, 95, 52,  18, 75, 37,   0, 52, 18,   0, 15,  0, 
103,190, 89,  90,169, 80,  78,151, 70,  64,132, 60,  51,113, 49,  37, 94, 38,  20, 75, 25,   0, 52,  5,   0, 15,  0, 
106,189, 69,  93,169, 61,  80,151, 53,  66,131, 45,  52,113, 36,  37, 94, 25,  19, 74, 11,   0, 51,  0,   0, 15,  0, 
 76,178,229,  68,159,205,  61,142,183,  50,124,160,  40,106,138,  28, 88,116,  12, 69, 93,   0, 45, 66,   0,  5, 29, 
 86,177,207,  78,158,184,  67,142,166,  56,123,145,  45,106,125,  31, 88,105,  16, 69, 83,   0, 45, 58,   0,  6, 22, 
 93,176,187,  81,158,168,  71,141,150,  61,123,131,  47,105,113,  35, 87, 94,  20, 68, 74,   0, 45, 51,   0,  5, 16, 
 98,175,168,  84,157,150,  75,140,134,  63,122,117,  50,104,100,  37, 87, 83,  21, 68, 65,   0, 45, 42,   0,  4,  7, 
100,174,149,  89,155,132,  76,139,117,  65,121,102,  53,104, 87,  39, 86, 72,  23, 67, 55,   0, 45, 34,   0,  3,  0, 
103,173,130,  92,155,115,  80,138,102,  68,120, 88,  53,103, 75,  40, 86, 61,  24, 67, 45,   0, 45, 25,   0,  3,  0, 
107,172,108,  95,154, 96,  82,137, 85,  70,119, 73,  55,102, 61,  42, 85, 49,  25, 67, 34,   0, 45, 14,   0,  3,  0, 
110,172, 86,  97,153, 76,  85,137, 67,  70,119, 57,  56,102, 46,  42, 84, 35,  26, 66, 21,   0, 44,  1,   0,  3,  0, 
112,171, 67,  98,153, 59,  86,137, 52,  71,119, 44,  58,102, 34,  44, 85, 22,  27, 66,  7,   0, 44,  0,   0,  3,  0, 
 90,160,215,  81,144,193,  70,129,173,  61,112,151,  49, 95,131,  37, 79,109,  22, 61, 87,   0, 38, 61,   0,  0, 25, 
 96,160,194,  86,143,174,  75,128,157,  65,112,137,  53, 95,117,  40, 78, 98,  25, 60, 78,   0, 38, 53,   0,  0, 17, 
100,159,177,  89,143,159,  79,128,143,  67,111,124,  55, 95,107,  42, 78, 89,  27, 60, 70,   2, 38, 46,   0,  0,  9, 
104,158,159,  92,142,143,  81,127,127,  69,110,110,  56, 94, 94,  43, 78, 78,  28, 60, 60,   2, 38, 38,   0,  0,  1, 
107,157,140,  94,141,125,  82,126,112,  71,110, 97,  59, 94, 82,  45, 77, 67,  29, 59, 51,   4, 37, 30,   0,  0,  0, 
110,156,122,  97,140,109,  85,125, 97,  72,109, 83,  58, 93, 71,  45, 77, 57,  29, 60, 42,   5, 38, 22,   0,  0,  0, 
111,156,103,  99,139, 91,  87,125, 81,  73,108, 69,  60, 92, 58,  46, 77, 45,  30, 59, 31,   5, 38, 12,   0,  0,  0, 
115,156, 82, 101,140, 73,  88,124, 63,  74,108, 53,  60, 92, 44,  46, 76, 32,  31, 59, 18,   6, 37,  0,   0,  0,  0, 
116,155, 65, 102,139, 58,  89,124, 49,  75,108, 41,  61, 92, 32,  48, 76, 21,  31, 59,  6,   5, 37,  0,   0,  0,  0, 
100,141,201,  88,127,181,  79,114,162,  69, 99,142,  57, 83,122,  44, 68,102,  30, 51, 81,   7, 28, 56,   0,  0, 19, 
105,141,182,  94,127,163,  83,114,146,  71, 98,128,  59, 83,110,  46, 68, 91,  31, 51, 72,  10, 28, 48,   0,  0, 11, 
108,141,166,  96,127,149,  85,113,133,  73, 98,116,  60, 83, 99,  46, 68, 82,  32, 51, 64,  11, 29, 41,   0,  0,  2, 
111,141,149,  98,126,134,  88,112,119,  74, 97,103,  61, 83, 88,  48, 67, 72,  33, 51, 56,  11, 29, 34,   0,  0,  0, 
112,140,132, 100,125,118,  89,112,105,  75, 97, 91,  62, 82, 77,  49, 68, 62,  33, 51, 47,  12, 29, 26,   0,  0,  0, 
115,140,116, 102,125,103,  90,111, 91,  76, 96, 78,  62, 82, 65,  49, 67, 52,  34, 51, 38,  13, 29, 18,   0,  0,  0, 
117,139, 97, 103,124, 87,  91,111, 77,  78, 96, 65,  63, 81, 54,  49, 67, 41,  34, 51, 27,  12, 29,  7,   0,  0,  0, 
119,138, 78, 105,124, 69,  92,110, 60,  78, 95, 50,  65, 81, 40,  50, 67, 29,  34, 51, 15,  13, 30,  0,   0,  0,  0, 
120,138, 64, 106,124, 54,  93,110, 47,  78, 95, 38,  65, 81, 29,  50, 66, 17,  34, 50,  2,  13, 29,  0,   0,  0,  0, 
107,124,189,  96,111,169,  85, 99,152,  73, 85,132,  61, 71,114,  48, 57, 95,  34, 41, 75,  14, 18, 51,   0,  0, 13, 
111,124,171, 100,111,153,  88, 99,137,  75, 85,120,  63, 72,103,  50, 58, 85,  36, 41, 66,  15, 19, 43,   0,  0,  4, 
113,124,156, 101,111,139,  90, 99,125,  77, 85,109,  64, 71, 93,  51, 57, 77,  36, 42, 59,  17, 20, 37,   0,  0,  0, 
115,124,140, 103,111,125,  90, 99,112,  78, 85, 97,  64, 71, 82,  52, 57, 67,  36, 42, 50,  16, 20, 30,   0,  0,  0, 
117,123,125, 104,110,111,  92, 98, 99,  79, 85, 86,  65, 71, 72,  51, 58, 59,  37, 42, 43,  17, 21, 22,   0,  0,  0, 
118,123,110, 105,110, 97,  93, 98, 86,  78, 84, 74,  66, 71, 62,  52, 57, 49,  37, 42, 34,  17, 22, 14,   0,  0,  0, 
120,123, 93, 106,109, 82,  94, 97, 72,  80, 84, 61,  66, 71, 50,  52, 57, 38,  37, 42, 24,  17, 22,  2,   0,  0,  0, 
121,122, 75, 108,109, 66,  95, 97, 58,  80, 84, 48,  66, 71, 37,  52, 57, 26,  37, 42, 12,  16, 22,  0,   0,  0,  0, 
122,123, 62, 108,109, 52,  95, 97, 45,  81, 84, 36,  67, 70, 26,  52, 57, 14,  37, 42,  0,  15, 22,  0,   0,  0,  0, 
113,107,177, 102, 96,159,  89, 85,141,  78, 72,124,  65, 60,107,  52, 46, 89,  37, 30, 70,  18,  5, 46,   0,  0,  6, 
116,107,160, 104, 96,144,  92, 85,129,  80, 72,112,  67, 60, 96,  53, 47, 80,  38, 31, 62,  19,  7, 39,   0,  0,  0, 
118,107,147, 105, 96,131,  93, 85,118,  80, 72,101,  67, 60, 87,  54, 47, 71,  39, 31, 54,  19,  8, 32,   0,  0,  0, 
119,107,132, 106, 96,118,  94, 85,106,  81, 73, 91,  67, 60, 77,  54, 47, 63,  39, 32, 47,  20,  9, 25,   0,  0,  0, 
119,107,118, 106, 95,105,  94, 85, 93,  81, 72, 80,  68, 60, 68,  54, 47, 54,  39, 32, 39,  20, 11, 18,   0,  0,  0, 
121,107,104, 107, 96, 92,  95, 84, 80,  81, 72, 69,  68, 61, 58,  54, 48, 46,  39, 33, 31,  20, 12,  9,   0,  0,  0, 
123,107, 88, 108, 95, 77,  96, 84, 68,  82, 72, 57,  68, 60, 46,  54, 47, 35,  39, 33, 20,  19, 13,  2,   0,  0,  0, 
123,106, 72, 110, 95, 63,  96, 84, 54,  82, 72, 45,  69, 60, 35,  55, 48, 23,  39, 33,  9,  18, 14,  0,   0,  0,  0, 
125,106, 60, 110, 94, 50,  98, 84, 42,  83, 72, 34,  69, 60, 25,  55, 48, 12,  39, 33,  0,  17, 13,  0,   0,  0,  0, 
118, 89,165, 105, 79,148,  93, 69,132,  81, 57,115,  68, 45, 99,  55, 32, 82,  41, 15, 64,  21,  0, 41,   0,  0,  0, 
120, 89,150, 107, 79,135,  96, 69,121,  82, 58,105,  70, 46, 89,  56, 34, 73,  41, 17, 56,  21,  0, 34,   0,  0,  0, 
121, 89,137, 108, 79,123,  96, 69,109,  82, 58, 95,  70, 47, 81,  56, 34, 66,  41, 18, 49,  21,  0, 28,   0,  0,  0, 
122, 90,124, 109, 79,110,  96, 69, 99,  83, 58, 85,  70, 47, 72,  56, 35, 58,  41, 19, 42,  21,  0, 22,   0,  0,  0, 
123, 90,111, 110, 79, 98,  97, 69, 87,  83, 59, 75,  70, 47, 63,  56, 35, 50,  41, 20, 35,  21,  0, 14,   0,  0,  0, 
123, 90, 98, 110, 79, 87,  97, 70, 76,  84, 58, 64,  70, 48, 53,  56, 36, 41,  40, 21, 26,  21,  0,  5,   0,  0,  0, 
125, 89, 84, 111, 79, 73,  97, 69, 64,  84, 59, 54,  70, 48, 43,  56, 36, 31,  40, 22, 17,  20,  1,  1,   0,  0,  0, 
125, 89, 69, 112, 79, 60,  98, 70, 51,  84, 59, 42,  70, 48, 32,  56, 36, 20,  41, 22,  5,  19,  2,  0,   0,  0,  0, 
126, 89, 57, 112, 79, 49,  99, 70, 41,  84, 59, 32,  70, 48, 22,  56, 36, 10,  40, 22,  0,  18,  2,  0,   0,  0,  0, 
121, 67,154, 108, 58,138,  97, 50,124,  84, 39,107,  71, 28, 92,  58, 12, 76,  43,  0, 59,  20,  0, 37,   0,  0,  0, 
124, 68,140, 111, 59,126,  98, 50,112,  84, 40, 98,  71, 29, 83,  58, 15, 67,  42,  0, 51,  20,  0, 30,   0,  0,  0, 
124, 68,129, 111, 59,114,  99, 51,102,  86, 41, 88,  71, 30, 75,  58, 17, 60,  42,  0, 45,  20,  0, 24,   0,  0,  0, 
125, 70,116, 111, 60,103,  99, 51, 92,  85, 41, 79,  71, 31, 66,  58, 19, 53,  42,  3, 38,  20,  0, 17,   0,  0,  0, 
125, 70,104, 111, 61, 93,  99, 52, 81,  85, 43, 69,  72, 32, 58,  58, 20, 45,  42,  4, 31,  20,  0,  8,   0,  0,  0, 
126, 70, 92, 111, 61, 81,  99, 52, 71,  85, 42, 60,  71, 33, 49,  57, 21, 37,  42,  6, 23,  20,  0,  3,   0,  0,  0, 
126, 70, 79, 112, 61, 70,  99, 53, 60,  85, 43, 50,  71, 33, 39,  57, 22, 28,  41,  7, 13,  19,  0,  0,   0,  0,  0, 
127, 71, 66, 113, 62, 56, 100, 53, 48,  86, 44, 39,  71, 34, 29,  57, 23, 18,  41,  8,  2,  18,  0,  0,   0,  0,  0, 
128, 70, 55, 114, 62, 46, 100, 54, 39,  86, 44, 30,  71, 34, 20,  57, 23,  7,  41,  9,  0,  18,  0,  0,   0,  0,  0, 
124, 41,145, 111, 32,128,  99, 23,114,  86, 10,100,  73,  0, 85,  60,  0, 71,  43,  0, 54,  17,  0, 32,   0,  0,  0, 
126, 42,131, 113, 33,117, 100, 25,104,  86, 14, 90,  73,  0, 77,  60,  0, 63,  44,  0, 47,  18,  0, 25,   0,  0,  0, 
127, 43,120, 113, 34,106, 101, 26, 95,  86, 17, 82,  73,  2, 69,  59,  0, 56,  43,  0, 41,  18,  0, 19,   0,  0,  0, 
127, 45,109, 113, 37, 97, 101, 28, 85,  86, 19, 74,  73,  5, 61,  59,  0, 48,  43,  0, 34,  19,  0, 11,   0,  0,  0, 
127, 46, 98, 114, 38, 86, 100, 30, 76,  87, 21, 65,  73,  9, 54,  59,  0, 41,  43,  0, 26,  18,  0,  5,   0,  0,  0, 
127, 47, 87, 113, 39, 76, 101, 31, 67,  86, 22, 56,  72, 11, 45,  59,  0, 33,  43,  0, 19,  18,  0,  2,   0,  0,  0, 
128, 48, 75, 114, 39, 65, 101, 33, 56,  86, 23, 46,  72, 12, 36,  58,  0, 24,  42,  0,  9,  17,  0,  0,   0,  0,  0, 
129, 48, 63, 114, 41, 54, 102, 33, 46,  87, 24, 36,  72, 14, 26,  58,  1, 14,  42,  0,  2,  16,  0,  0,   0,  0,  0, 
128, 48, 53, 114, 41, 44, 102, 34, 37,  87, 25, 27,  72, 15, 17,  58,  1,  3,  41,  0,  0,  15,  0,  0,   0,  0,  0, 
  0,189,242,   0,169,217,   0,151,194,   0,132,170,   0,113,147,   0, 94,123,   0, 74, 99,   0, 51, 71,   0, 15, 34, 
  1,187,219,   1,167,195,   0,150,175,   0,131,153,   0,113,132,   0, 94,111,   0, 74, 89,   0, 50, 63,   0, 13, 28, 
  1,186,198,   1,167,178,   0,149,158,   0,130,139,   0,111,119,   0, 93,100,   0, 74, 80,   0, 50, 55,   0, 13, 22, 
  1,185,176,   1,165,159,   1,148,142,   0,129,123,   0,111,106,   0, 93, 89,   0, 73, 70,   0, 50, 47,   0, 13, 13, 
  1,184,157,   1,164,141,   1,147,125,   0,128,110,   0,110, 93,   0, 92, 77,   0, 73, 60,   0, 50, 39,   0, 12,  5, 
 25,182,137,  25,163,122,  17,146,109,   0,128, 96,   0,110, 81,   0, 92, 66,   0, 73, 51,   0, 50, 30,   0, 10,  0, 
 42,181,114,  35,163,102,  30,145, 91,  14,127, 80,   0,109, 67,   0, 91, 53,   0, 72, 39,   0, 50, 19,   0, 10,  0, 
 52,181, 92,  43,162, 83,  32,145, 73,  19,126, 63,   0,108, 52,   0, 90, 40,   0, 72, 27,   0, 50,  7,   0, 10,  0, 
 57,181, 74,  48,162, 66,  37,144, 57,  24,126, 49,   7,108, 40,   0, 90, 29,   0, 72, 15,   0, 49,  0,   0, 10,  0, 
  1,170,227,   1,152,203,   0,136,182,   0,119,159,   0,101,137,   0, 84,115,   0, 65, 92,   0, 43, 66,   0,  1, 29, 
  1,169,206,   1,151,184,   1,136,165,   0,118,144,   0,102,125,   0, 84,105,   0, 65, 83,   0, 43, 58,   0,  0, 22, 
 29,168,186,  21,151,167,  14,135,150,   4,118,131,   0,101,112,   0, 83, 94,   0, 65, 75,   0, 43, 51,   0,  0, 16, 
 41,167,167,  33,150,150,  31,134,134,  19,117,117,   4,100,100,   0, 83, 83,   0, 65, 65,   0, 42, 43,   0,  0,  8, 
 48,167,149,  41,149,133,  33,133,118,  25,116,103,  13, 99, 88,   0, 83, 73,   0, 65, 56,   0, 42, 35,   0,  0,  0, 
 58,165,130,  49,148,115,  42,132,103,  31,115, 89,  18, 99, 75,   0, 82, 61,   0, 64, 46,   0, 42, 26,   0,  0,  0, 
 62,164,110,  55,147, 97,  45,132, 87,  35,115, 75,  22, 98, 63,   5, 82, 50,   0, 64, 36,   0, 42, 16,   0,  0,  0, 
 69,164, 89,  60,147, 78,  50,131, 70,  37,114, 59,  26, 98, 49,  10, 81, 37,   0, 64, 24,   0, 42,  4,   0,  0,  0, 
 71,164, 71,  63,147, 63,  53,131, 55,  40,114, 47,  28, 98, 38,  13, 81, 26,   0, 64, 12,   0, 42,  0,   0,  0,  0, 
 28,153,214,  24,138,193,  23,123,171,  16,107,150,   0, 91,130,   0, 75,109,   0, 58, 87,   0, 35, 61,   0,  0, 25, 
 48,153,194,  41,138,174,  34,123,156,  27,107,136,  16, 91,117,   1, 75, 98,   0, 57, 78,   0, 35, 53,   0,  0, 17, 
 55,153,177,  47,137,158,  42,122,142,  33,107,124,  22, 91,106,   6, 75, 88,   0, 57, 70,   0, 35, 46,   0,  0,  9, 
 61,152,158,  53,136,143,  45,122,127,  36,106,111,  24, 90, 94,  10, 74, 78,   0, 57, 61,   0, 35, 39,   0,  0,  2, 
 67,151,141,  59,135,126,  49,121,112,  39,105, 98,  29, 90, 83,  14, 74, 68,   0, 57, 52,   0, 35, 31,   0,  0,  0, 
 71,150,123,  62,135,110,  54,120, 98,  42,105, 84,  31, 89, 71,  16, 74, 58,   0, 57, 43,   0, 35, 22,   0,  0,  0, 
 74,150,105,  64,134, 92,  55,120, 83,  45,104, 71,  34, 89, 59,  20, 73, 47,   0, 57, 32,   0, 35, 13,   0,  0,  0, 
 78,149, 84,  69,134, 75,  59,120, 66,  47,103, 56,  34, 88, 46,  22, 73, 34,   1, 57, 20,   0, 35,  1,   0,  0,  0, 
 80,149, 69,  70,133, 61,  60,119, 53,  49,103, 44,  36, 88, 35,  23, 73, 24,   2, 56, 10,   0, 35,  0,   0,  0,  0, 
 58,136,200,  50,122,180,  45,109,162,  38, 94,141,  27, 80,121,  15, 65,102,   0, 48, 81,   0, 26, 56,   0,  0, 19, 
 66,136,182,  59,122,163,  52,109,146,  42, 94,128,  32, 80,109,  20, 65, 91,   2, 48, 72,   0, 26, 49,   0,  0, 11, 
 70,136,165,  62,122,149,  55,108,133,  46, 94,116,  35, 80, 99,  21, 65, 82,   4, 49, 64,   0, 26, 41,   0,  0,  3, 
 76,135,149,  66,121,133,  58,108,119,  48, 94,103,  36, 79, 88,  23, 65, 73,   7, 49, 56,   0, 27, 34,   0,  0,  0, 
 78,135,133,  69,120,118,  60,107,106,  50, 93, 92,  39, 79, 77,  26, 65, 63,   8, 49, 47,   0, 27, 26,   0,  0,  0, 
 82,134,117,  71,120,104,  62,107, 92,  51, 93, 79,  39, 78, 66,  27, 64, 53,  10, 48, 39,   0, 27, 18,   0,  0,  0, 
 84,134, 99,  73,119, 87,  64,106, 77,  53, 92, 66,  42, 78, 55,  28, 64, 42,  11, 48, 29,   0, 28,  9,   0,  0,  0, 
 87,133, 81,  76,119, 72,  66,106, 62,  55, 92, 52,  43, 78, 42,  29, 64, 31,  12, 48, 17,   0, 28,  0,   0,  0,  0, 
 88,134, 67,  77,119, 58,  68,106, 51,  56, 92, 42,  44, 78, 32,  30, 64, 20,  12, 48,  6,   0, 28,  0,   0,  0,  0, 
 73,120,189,  64,107,168,  57, 96,151,  47, 82,133,  38, 69,114,  26, 55, 95,  11, 39, 75,   0, 16, 51,   0,  0, 14, 
 78,120,171,  69,107,153,  62, 95,137,  51, 82,119,  40, 69,102,  29, 55, 85,  15, 39, 66,   0, 17, 44,   0,  0,  4, 
 81,120,156,  71,107,140,  64, 95,125,  53, 82,109,  42, 69, 93,  31, 55, 77,  16, 39, 59,   0, 18, 37,   0,  0,  0, 
 85,120,141,  74,107,126,  65, 95,112,  54, 82, 97,  43, 69, 82,  32, 55, 67,  17, 39, 51,   0, 19, 30,   0,  0,  0, 
 86,119,126,  76,106,112,  66, 95,100,  56, 81, 85,  45, 69, 72,  33, 55, 59,  18, 40, 43,   0, 19, 22,   0,  0,  0, 
 89,119,110,  78,106, 98,  69, 94, 87,  56, 81, 75,  46, 68, 62,  33, 55, 49,  18, 40, 35,   0, 20, 15,   0,  0,  0, 
 89,119, 95,  80,106, 83,  70, 94, 73,  58, 81, 63,  46, 68, 51,  34, 55, 39,  19, 40, 25,   0, 20,  4,   0,  0,  0, 
 92,118, 78,  82,106, 68,  70, 93, 59,  59, 81, 49,  47, 68, 39,  34, 55, 28,  19, 40, 14,   0, 20,  0,   0,  0,  0, 
 93,118, 65,  82,105, 55,  72, 93, 48,  60, 81, 39,  47, 68, 29,  34, 55, 18,  20, 40,  2,   0, 20,  0,   0,  0,  0, 
 83,104,177,  74, 93,159,  65, 82,142,  56, 70,124,  45, 57,106,  33, 44, 89,  20, 28, 70,   1,  4, 46,   0,  0,  8, 
 86,104,161,  78, 93,145,  68, 82,128,  58, 70,112,  48, 58, 96,  35, 45, 80,  21, 29, 62,   1,  6, 40,   0,  0,  0, 
 89,104,147,  79, 93,131,  69, 82,118,  59, 70,102,  47, 58, 87,  36, 45, 72,  23, 29, 55,   3,  7, 33,   0,  0,  0, 
 90,104,132,  80, 93,119,  71, 82,106,  60, 70, 91,  48, 58, 77,  37, 45, 62,  23, 30, 47,   4,  7, 26,   0,  0,  0, 
 92,104,118,  82, 93,105,  72, 82, 93,  61, 69, 80,  50, 58, 68,  37, 45, 55,  23, 30, 39,   4,  8, 18,   0,  0,  0, 
 94,104,105,  82, 92, 93,  72, 82, 82,  61, 70, 70,  50, 58, 58,  38, 46, 46,  23, 31, 31,   6, 10, 11,   0,  0,  0, 
 95,104, 90,  84, 92, 79,  74, 82, 70,  62, 70, 58,  50, 58, 48,  37, 46, 36,  23, 31, 22,   4, 11,  3,   0,  0,  0, 
 96,103, 74,  85, 92, 65,  75, 81, 56,  63, 70, 47,  50, 58, 37,  38, 46, 25,  24, 31, 11,   3, 11,  0,   0,  0,  0, 
 97,103, 62,  86, 92, 53,  76, 81, 45,  63, 69, 36,  51, 58, 27,  38, 46, 15,  23, 31,  0,   3, 11,  0,   0,  0,  0, 
 90, 87,165,  81, 77,148,  72, 67,132,  62, 55,116,  50, 44, 99,  39, 31, 82,  25, 14, 64,   1,  0, 42,   0,  0,  1, 
 93, 87,150,  83, 77,135,  74, 67,121,  63, 56,105,  52, 45, 90,  40, 32, 74,  25, 16, 57,   3,  0, 35,   0,  0,  0, 
 95, 87,138,  85, 77,123,  75, 67,109,  63, 57, 95,  53, 45, 81,  41, 33, 66,  26, 17, 50,   4,  0, 28,   0,  0,  0, 
 95, 88,124,  85, 77,111,  75, 67, 99,  63, 57, 86,  53, 45, 72,  41, 33, 58,  26, 18, 43,   5,  1, 22,   0,  0,  0, 
 97, 88,112,  87, 77,100,  76, 68, 88,  64, 57, 76,  53, 46, 63,  41, 34, 50,  26, 19, 35,   5,  2, 14,   0,  0,  0, 
 99, 87, 99,  87, 78, 88,  76, 68, 77,  65, 57, 65,  53, 46, 54,  41, 35, 42,  27, 20, 27,   6,  2,  5,   0,  0,  0, 
100, 87, 85,  88, 77, 75,  77, 68, 65,  65, 57, 54,  53, 46, 44,  41, 35, 32,  27, 21, 19,   5,  3,  2,   0,  0,  0, 
100, 88, 71,  89, 77, 61,  78, 68, 53,  66, 57, 44,  53, 47, 33,  41, 35, 22,  27, 21,  7,   5,  3,  0,   0,  0,  0, 
101, 87, 60,  90, 77, 52,  79, 68, 44,  66, 58, 34,  53, 47, 25,  41, 35, 13,  26, 22,  0,   5,  3,  0,   0,  0,  0, 
 97, 67,155,  86, 58,138,  77, 50,125,  66, 39,108,  55, 28, 92,  43, 12, 76,  29,  0, 59,   2,  0, 37,   0,  0,  0, 
 99, 67,141,  88, 59,127,  78, 50,113,  68, 40, 98,  56, 29, 83,  44, 15, 68,  29,  0, 52,   3,  0, 30,   0,  0,  0, 
100, 68,129,  89, 59,115,  80, 51,103,  68, 41, 89,  56, 30, 75,  44, 16, 61,  30,  0, 45,   4,  0, 24,   0,  0,  0, 
100, 69,118,  90, 60,104,  80, 51, 92,  67, 41, 79,  56, 31, 66,  44, 18, 53,  29,  2, 38,   4,  0, 18,   0,  0,  0, 
101, 69,104,  90, 61, 93,  79, 51, 82,  67, 42, 70,  56, 32, 59,  44, 20, 46,  29,  4, 31,   6,  0,  9,   0,  0,  0, 
102, 69, 93,  90, 61, 83,  80, 52, 72,  68, 42, 61,  56, 33, 50,  43, 20, 38,  29,  5, 23,   7,  0,  4,   0,  0,  0, 
102, 70, 80,  91, 61, 71,  80, 52, 61,  68, 43, 51,  56, 32, 40,  44, 21, 29,  30,  6, 14,   7,  0,  0,   0,  0,  0, 
103, 70, 68,  92, 61, 58,  81, 53, 50,  69, 43, 41,  56, 34, 31,  43, 22, 19,  29,  7,  3,   7,  0,  0,   0,  0,  0, 
104, 70, 57,  92, 61, 48,  82, 53, 40,  69, 43, 32,  56, 34, 22,  43, 23, 10,  29,  8,  0,   6,  0,  0,   0,  0,  0, 
101, 45,145,  91, 35,129,  80, 26,116,  69, 15,101,  59,  0, 86,  46,  0, 71,  31,  0, 55,   0,  0, 33,   0,  0,  0, 
104, 44,132,  92, 36,118,  82, 28,105,  71, 17, 91,  58,  3, 77,  46,  0, 63,  31,  0, 48,   2,  0, 26,   0,  0,  0, 
104, 46,121,  93, 37,107,  82, 30, 96,  70, 20, 83,  58,  6, 70,  46,  0, 57,  32,  0, 41,   4,  0, 20,   0,  0,  0, 
104, 48,110,  93, 40, 98,  82, 31, 87,  70, 22, 74,  59,  9, 62,  45,  0, 49,  31,  0, 35,   6,  0, 13,   0,  0,  0, 
104, 48, 99,  92, 41, 88,  82, 32, 77,  70, 23, 65,  58, 11, 54,  46,  0, 42,  32,  0, 27,   7,  0,  5,   0,  0,  0, 
105, 50, 88,  93, 41, 77,  82, 34, 68,  71, 24, 57,  58, 13, 46,  45,  1, 35,  31,  0, 21,   7,  0,  2,   0,  0,  0, 
105, 50, 76,  94, 41, 66,  83, 34, 57,  71, 25, 47,  58, 15, 37,  45,  2, 25,  32,  0, 11,   7,  0,  0,   0,  0,  0, 
106, 50, 64,  94, 42, 55,  83, 35, 47,  71, 26, 38,  58, 16, 27,  45,  4, 17,  31,  0,  4,   7,  0,  0,   0,  0,  0, 
106, 51, 54,  95, 42, 45,  83, 35, 38,  71, 27, 30,  58, 16, 19,  45,  5,  7,  30,  0,  0,   6,  0,  0,   0,  0,  0, 
  0,181,240,   0,162,216,   0,144,193,   0,126,168,   0,109,146,   0, 91,123,   0, 71, 98,   0, 48, 71,   0,  9, 34, 
  0,179,218,   0,161,195,   0,144,174,   0,126,153,   0,108,132,   0, 90,110,   0, 71, 88,   0, 48, 63,   0,  8, 29, 
  0,178,197,   0,159,177,   0,143,159,   0,125,139,   0,107,119,   0, 90, 99,   0, 71, 79,   0, 48, 55,   0,  8, 22, 
  0,177,177,   0,158,158,   0,142,141,   0,124,123,   0,107,106,   0, 89, 88,   0, 71, 70,   0, 48, 47,   0,  8, 14, 
  0,176,157,   0,158,141,   0,141,126,   0,123,109,   0,106, 93,   0, 89, 78,   0, 70, 60,   0, 47, 39,   0,  7,  5, 
  0,175,138,   0,157,123,   0,141,110,   0,123, 96,   0,105, 81,   0, 88, 67,   0, 70, 51,   0, 48, 30,   0,  6,  0, 
  0,173,115,   0,155,104,   0,140, 92,   0,122, 80,   0,105, 67,   0, 88, 55,   0, 69, 40,   0, 47, 20,   0,  6,  0, 
  0,173, 94,   0,155, 85,   0,139, 75,   0,121, 64,   0,104, 53,   0, 88, 42,   0, 70, 28,   0, 47,  9,   0,  6,  0, 
  0,173, 76,   0,155, 70,   0,138, 61,   0,122, 53,   0,104, 44,   0, 87, 32,   0, 69, 18,   0, 47,  0,   0,  6,  0, 
  0,164,226,   0,147,203,   0,131,181,   0,114,158,   0, 97,136,   0, 80,115,   0, 63, 92,   0, 40, 65,   0,  0, 30, 
  0,162,205,   0,145,184,   0,130,164,   0,114,143,   0, 97,124,   0, 81,104,   0, 63, 83,   0, 40, 58,   0,  0, 23, 
  0,162,187,   0,145,167,   0,130,150,   0,113,131,   0, 96,112,   0, 80, 93,   0, 62, 74,   0, 40, 50,   0,  0, 16, 
  0,160,167,   0,144,150,   0,129,134,   0,112,116,   0, 96,100,   0, 80, 82,   0, 62, 65,   0, 40, 43,   0,  0,  7, 
  0,160,148,   0,143,133,   0,128,118,   0,111,103,   0, 96, 88,   0, 80, 73,   0, 62, 56,   0, 40, 35,   0,  0,  0, 
  0,158,130,   0,142,117,   0,127,104,   0,111, 89,   0, 95, 76,   0, 79, 62,   0, 62, 46,   0, 40, 26,   0,  0,  0, 
  0,158,111,   0,141, 99,   0,127, 88,   0,111, 76,   0, 95, 63,   0, 79, 51,   0, 62, 37,   0, 40, 18,   0,  0,  0, 
  0,158, 91,   0,141, 81,   0,126, 72,   0,110, 62,   0, 94, 50,   0, 79, 39,   0, 62, 25,   0, 40,  5,   0,  0,  0, 
  0,157, 74,   0,141, 66,   0,126, 59,   0,110, 49,   0, 94, 40,   0, 78, 29,   0, 61, 15,   0, 40,  0,   0,  0,  0, 
  0,148,214,   0,133,192,   0,119,171,   0,103,150,   0, 87,129,   0, 72,108,   0, 55, 86,   0, 32, 61,   0,  0, 25, 
  0,147,193,   0,132,173,   0,118,155,   0,103,136,   0, 87,116,   0, 72, 98,   0, 55, 78,   0, 32, 53,   0,  0, 17, 
  0,147,176,   0,132,158,   0,118,142,   0,102,124,   0, 87,106,   0, 72, 88,   0, 55, 69,   0, 33, 46,   0,  0,  9, 
  0,146,159,   0,131,142,   0,117,127,   0,102,111,   0, 87, 95,   0, 71, 79,   0, 55, 61,   0, 33, 39,   0,  0,  2, 
  0,145,140,   0,130,126,   0,117,112,   0,101, 98,   0, 86, 83,   0, 71, 68,   0, 55, 52,   0, 33, 31,   0,  0,  0, 
  0,144,124,   0,130,111,   0,116, 99,   0,101, 84,   0, 86, 72,   0, 71, 59,   0, 55, 43,   0, 33, 23,   0,  0,  0, 
  0,144,106,   0,129, 94,   0,115, 83,   0,101, 72,   0, 85, 60,   0, 71, 48,   0, 55, 34,   0, 33, 14,   0,  0,  0, 
  3,143, 86,   0,129, 77,   0,115, 68,   0,100, 58,   0, 85, 48,   0, 70, 36,   0, 54, 22,   0, 33,  3,   0,  0,  0, 
 18,143, 72,  13,128, 63,   0,115, 57,   0,100, 47,   0, 85, 37,   0, 70, 26,   0, 54, 13,   0, 33,  0,   0,  0,  0, 
  0,132,200,   0,118,179,   0,105,161,   0, 91,140,   0, 76,121,   0, 62,101,   0, 46, 81,   0, 24, 56,   0,  0, 19, 
  0,131,182,   0,118,163,   0,105,146,   0, 91,128,   0, 77,110,   0, 62, 91,   0, 46, 72,   0, 25, 48,   0,  0, 11, 
  0,131,165,   0,117,149,   0,104,133,   0, 91,116,   0, 77, 99,   0, 62, 82,   0, 46, 64,   0, 25, 41,   0,  0,  4, 
  0,131,149,   0,116,134,   0,104,119,   0, 91,104,   0, 77, 89,   0, 62, 73,   0, 46, 56,   0, 25, 34,   0,  0,  0, 
 10,130,133,   2,116,119,   0,104,106,   0, 90, 91,   0, 76, 78,   0, 62, 64,   0, 46, 48,   0, 26, 27,   0,  0,  0, 
 23,130,118,  20,116,104,  13,103, 93,   3, 89, 79,   0, 76, 67,   0, 62, 54,   0, 46, 39,   0, 26, 19,   0,  0,  0, 
 33,129,101,  27,115, 89,  19,103, 79,   9, 89, 67,   0, 75, 56,   0, 61, 43,   0, 46, 29,   0, 26, 10,   0,  0,  0, 
 41,128, 83,  35,115, 73,  27,102, 64,  15, 89, 55,   0, 76, 45,   0, 62, 33,   0, 46, 18,   0, 26,  0,   0,  0,  0, 
 43,129, 69,  38,115, 61,  30,102, 54,  17, 89, 45,   2, 75, 34,   0, 61, 23,   0, 46,  9,   0, 26,  0,   0,  0,  0, 
  1,116,188,   1,104,168,   0, 92,151,   0, 79,132,   0, 66,113,   0, 52, 94,   0, 36, 75,   0, 14, 52,   0,  0, 14, 
 17,116,171,  16,104,153,  14, 92,137,   8, 79,119,   0, 67,102,   0, 53, 85,   0, 37, 67,   0, 16, 44,   0,  0,  4, 
 31,116,155,  27,104,140,  21, 92,125,  13, 79,109,   3, 66, 93,   0, 53, 77,   0, 37, 59,   0, 16, 38,   0,  0,  0, 
 37,115,141,  30,103,126,  26, 92,112,  16, 79, 98,   5, 66, 83,   0, 53, 67,   0, 38, 51,   0, 17, 31,   0,  0,  0, 
 41,115,126,  37,103,112,  31, 92,100,  22, 79, 86,  10, 66, 72,   0, 53, 59,   0, 38, 44,   0, 17, 23,   0,  0,  0, 
 48,115,111,  41,102, 99,  34, 91, 88,  24, 78, 76,  14, 66, 63,   0, 53, 50,   0, 38, 36,   0, 18, 15,   0,  0,  0, 
 51,115, 95,  46,102, 85,  37, 91, 74,  26, 78, 63,  16, 66, 52,   0, 53, 40,   0, 38, 26,   0, 18,  5,   0,  0,  0, 
 55,114, 80,  47,102, 69,  40, 90, 60,  30, 78, 51,  19, 66, 41,   3, 53, 29,   0, 38, 15,   0, 17,  0,   0,  0,  0, 
 56,114, 66,  50,102, 58,  40, 91, 50,  32, 78, 41,  18, 66, 32,   4, 53, 21,   0, 38,  5,   0, 17,  0,   0,  0,  0, 
 39,102,178,  37, 90,159,  30, 79,142,  21, 68,124,  14, 55,106,   0, 42, 89,   0, 26, 70,   0,  4, 46,   0,  0,  8, 
 48,102,161,  42, 90,145,  35, 79,128,  26, 68,112,  19, 55, 96,   3, 43, 79,   0, 27, 62,   0,  6, 40,   0,  0,  0, 
 50,102,147,  44, 90,132,  37, 79,118,  30, 68,102,  20, 56, 87,   7, 43, 72,   0, 28, 55,   0,  6, 34,   0,  0,  0, 
 53,101,133,  47, 90,118,  41, 79,106,  32, 68, 91,  21, 56, 78,   9, 43, 63,   0, 28, 47,   0,  6, 26,   0,  0,  0, 
 57,101,119,  50, 89,106,  42, 79, 94,  34, 67, 81,  24, 56, 68,   9, 44, 55,   0, 29, 40,   0,  6, 19,   0,  0,  0, 
 60,100,105,  50, 90, 94,  45, 80, 83,  36, 68, 71,  24, 56, 59,  11, 44, 46,   0, 29, 32,   0,  7, 12,   0,  0,  0, 
 63,101, 91,  55, 90, 80,  46, 79, 70,  37, 68, 59,  26, 56, 49,  12, 44, 37,   1, 29, 23,   0,  7,  3,   0,  0,  0, 
 64,101, 75,  56, 89, 67,  48, 79, 57,  37, 68, 48,  27, 56, 37,  15, 44, 26,   0, 29, 12,   0,  7,  0,   0,  0,  0, 
 66,101, 64,  58, 89, 55,  49, 79, 47,  39, 68, 38,  27, 56, 29,  14, 44, 18,   1, 30,  2,   0,  7,  0,   0,  0,  0, 
 57, 86,165,  51, 75,148,  45, 65,133,  38, 54,116,  28, 43,100,  16, 29, 83,   0, 13, 64,   0,  0, 42,   0,  0,  3, 
 60, 86,151,  55, 75,135,  47, 66,121,  39, 55,105,  30, 44, 90,  18, 31, 74,   3, 16, 57,   0,  1, 35,   0,  0,  0, 
 62, 86,139,  56, 75,123,  49, 66,110,  40, 55, 95,  30, 44, 81,  19, 31, 66,   4, 17, 51,   0,  1, 29,   0,  0,  0, 
 65, 86,125,  56, 76,112,  49, 66, 99,  39, 55, 86,  31, 44, 72,  19, 32, 59,   5, 18, 44,   0,  1, 23,   0,  0,  0, 
 67, 86,113,  58, 75,100,  51, 66, 88,  41, 56, 77,  31, 45, 64,  20, 32, 51,   6, 18, 35,   0,  1, 14,   0,  0,  0, 
 69, 86, 99,  61, 76, 88,  52, 66, 78,  43, 56, 66,  32, 45, 55,  20, 33, 42,   7, 19, 27,   0,  1,  6,   0,  0,  0, 
 69, 86, 86,  61, 76, 75,  53, 67, 66,  43, 56, 55,  33, 45, 45,  21, 34, 34,   8, 20, 20,   0,  2,  2,   0,  0,  0, 
 71, 86, 72,  63, 75, 62,  54, 66, 55,  45, 56, 45,  33, 45, 35,  22, 34, 23,   7, 20,  8,   0,  2,  0,   0,  0,  0, 
 71, 86, 62,  64, 75, 53,  55, 66, 46,  45, 56, 36,  33, 46, 27,  22, 34, 15,   8, 20,  0,   0,  2,  0,   0,  0,  0, 
 69, 67,156,  61, 58,140,  53, 50,125,  45, 39,108,  35, 28, 93,  25, 12, 77,  12,  0, 59,   0,  0, 37,   0,  0,  0, 
 71, 68,142,  63, 59,126,  56, 50,114,  47, 40, 98,  37, 28, 84,  26, 15, 68,  12,  0, 53,   0,  0, 30,   0,  0,  0, 
 72, 68,130,  63, 59,116,  56, 50,104,  47, 40, 90,  38, 30, 75,  27, 16, 61,  13,  0, 46,   0,  0, 24,   0,  0,  0, 
 73, 69,118,  65, 59,105,  57, 51, 92,  47, 41, 80,  37, 30, 67,  26, 18, 53,  14,  1, 39,   0,  0, 18,   0,  0,  0, 
 74, 69,106,  65, 60, 93,  57, 51, 82,  48, 41, 70,  38, 31, 59,  26, 19, 46,  13,  2, 32,   0,  0, 10,   0,  0,  0, 
 76, 69, 95,  66, 61, 84,  58, 52, 73,  48, 42, 61,  37, 32, 50,  26, 20, 38,  14,  4, 24,   0,  0,  4,   0,  0,  0, 
 76, 69, 81,  68, 60, 72,  58, 52, 62,  48, 42, 51,  38, 32, 41,  27, 21, 30,  14,  4, 16,   0,  0,  1,   0,  0,  0, 
 76, 69, 68,  68, 61, 60,  60, 52, 51,  49, 43, 41,  38, 33, 32,  27, 21, 20,  14,  5,  5,   0,  0,  0,   0,  0,  0, 
 78, 70, 59,  69, 61, 50,  60, 52, 42,  49, 43, 34,  39, 33, 24,  27, 22, 13,  14,  7,  1,   0,  0,  0,   0,  0,  0, 
 75, 46,146,  68, 38,131,  60, 30,117,  50, 19,102,  41,  4, 87,  29,  0, 72,  13,  0, 55,   0,  0, 33,   0,  0,  0, 
 78, 47,132,  70, 39,119,  61, 30,105,  53, 20, 92,  42,  5, 78,  30,  0, 64,  13,  0, 49,   0,  0, 27,   0,  0,  0, 
 79, 48,122,  70, 40,108,  62, 32, 96,  52, 22, 84,  42,  9, 71,  30,  0, 58,  14,  0, 42,   0,  0, 20,   0,  0,  0, 
 79, 50,111,  70, 42, 99,  62, 33, 88,  52, 23, 74,  41, 11, 63,  29,  0, 50,  14,  0, 36,   0,  0, 14,   0,  0,  0, 
 80, 50, 99,  70, 42, 89,  61, 34, 78,  52, 25, 67,  41, 14, 55,  30,  0, 42,  15,  0, 28,   0,  0,  6,   0,  0,  0, 
 81, 51, 89,  71, 43, 78,  62, 35, 69,  52, 25, 58,  42, 15, 47,  30,  3, 36,  15,  0, 22,   0,  0,  3,   0,  0,  0, 
 81, 51, 77,  71, 44, 68,  63, 36, 59,  53, 26, 49,  41, 16, 38,  31,  4, 27,  16,  0, 12,   0,  0,  0,   0,  0,  0, 
 81, 52, 65,  72, 43, 56,  63, 36, 48,  53, 27, 39,  41, 17, 29,  30,  4, 18,  14,  0,  3,   0,  0,  0,   0,  0,  0, 
 81, 52, 55,  73, 44, 47,  64, 36, 39,  53, 28, 32,  42, 18, 21,  31,  6,  9,  14,  0,  0,   0,  0,  0,   0,  0,  0, 
  0,174,239,   0,156,214,   0,139,192,   0,121,168,   0,105,145,   0, 87,123,   0, 68, 98,   0, 46, 70,   0,  3, 35, 
  0,172,217,   0,155,194,   0,139,173,   0,121,152,   0,104,130,   0, 87,110,   0, 69, 88,   0, 46, 63,   0,  4, 28, 
  0,171,197,   0,153,175,   0,138,158,   0,121,139,   0,103,118,   0, 86,100,   0, 68, 79,   0, 46, 55,   0,  4, 22, 
  0,170,177,   0,152,158,   0,136,141,   0,119,124,   0,103,106,   0, 86, 88,   0, 68, 70,   0, 45, 47,   0,  3, 14, 
  0,169,157,   0,152,141,   0,136,126,   0,119,109,   0,102, 94,   0, 86, 78,   0, 68, 60,   0, 46, 39,   0,  3,  5, 
  0,167,138,   0,150,124,   0,135,111,   0,118, 97,   0,102, 82,   0, 85, 68,   0, 68, 52,   0, 46, 31,   0,  3,  0, 
  0,167,118,   0,150,104,   0,135, 94,   0,118, 81,   0,101, 69,   0, 84, 56,   0, 67, 41,   0, 45, 21,   0,  3,  0, 
  0,166, 97,   0,149, 87,   0,134, 77,   0,117, 67,   0,101, 56,   0, 85, 44,   0, 67, 30,   0, 45, 10,   0,  3,  0, 
  0,165, 79,   0,149, 73,   0,133, 64,   0,117, 56,   0,101, 46,   0, 85, 34,   0, 68, 21,   0, 46,  1,   0,  3,  0, 
  0,158,225,   0,141,201,   0,126,180,   0,109,158,   0, 94,136,   0, 78,114,   0, 60, 91,   0, 38, 66,   0,  0, 30, 
  0,156,203,   0,140,183,   0,125,164,   0,109,143,   0, 94,124,   0, 78,104,   0, 61, 83,   0, 38, 57,   0,  0, 23, 
  0,156,186,   0,140,166,   0,125,150,   0,109,130,   0, 93,111,   0, 77, 93,   0, 60, 74,   0, 38, 50,   0,  0, 17, 
  0,155,167,   0,138,149,   0,124,134,   0,109,117,   0, 93,100,   0, 76, 83,   0, 60, 65,   0, 38, 43,   0,  0,  9, 
  0,153,147,   0,138,134,   0,124,120,   0,107,103,   0, 92, 88,   0, 77, 73,   0, 60, 56,   0, 38, 35,   0,  0,  0, 
  0,153,131,   0,137,118,   0,122,105,   0,107, 90,   0, 91, 76,   0, 76, 63,   0, 60, 47,   0, 39, 28,   0,  0,  0, 
  0,153,111,   0,136,100,   0,123, 90,   0,107, 77,   0, 92, 65,   0, 76, 52,   0, 60, 37,   0, 38, 18,   0,  0,  0, 
  0,152, 93,   0,136, 82,   0,122, 74,   0,106, 63,   0, 91, 52,   0, 76, 40,   0, 59, 26,   0, 38,  6,   0,  0,  0, 
  0,151, 78,   0,136, 69,   0,121, 61,   0,106, 52,   0, 91, 43,   0, 76, 32,   0, 59, 17,   0, 38,  0,   0,  0,  0, 
  0,143,213,   0,128,191,   0,115,171,   0,100,149,   0, 84,128,   0, 69,108,   0, 52, 86,   0, 30, 61,   0,  0, 25, 
  0,142,193,   0,127,173,   0,114,154,   0, 99,134,   0, 84,116,   0, 69, 98,   0, 52, 77,   0, 31, 53,   0,  0, 18, 
  0,141,176,   0,127,158,   0,114,141,   0, 98,122,   0, 84,105,   0, 69, 88,   0, 53, 69,   0, 31, 46,   0,  0,  9, 
  0,141,159,   0,126,142,   0,113,127,   0, 98,110,   0, 83, 95,   0, 69, 78,   0, 53, 60,   0, 32, 39,   0,  0,  2, 
  0,140,140,   0,126,126,   0,112,112,   0, 98, 98,   0, 83, 83,   0, 68, 69,   0, 52, 52,   0, 31, 31,   0,  0,  0, 
  0,140,124,   0,125,112,   0,112,100,   0, 97, 86,   0, 83, 72,   0, 68, 59,   0, 52, 44,   0, 31, 23,   0,  0,  0, 
  0,139,106,   0,125, 96,   0,111, 85,   0, 97, 72,   0, 83, 62,   0, 68, 49,   0, 52, 35,   0, 31, 15,   0,  0,  0, 
  0,138, 88,   0,124, 79,   0,111, 70,   0, 96, 59,   0, 82, 48,   0, 68, 38,   0, 52, 24,   0, 31,  4,   0,  0,  0, 
  0,139, 76,   0,124, 66,   0,111, 58,   0, 96, 50,   0, 82, 40,   0, 68, 29,   0, 52, 15,   0, 31,  0,   0,  0,  0, 
  0,129,200,   0,114,179,   0,102,160,   0, 87,139,   0, 74,120,   0, 60,101,   0, 44, 81,   0, 22, 56,   0,  0, 19, 
  0,127,181,   0,114,163,   0,102,146,   0, 88,127,   0, 74,109,   0, 60, 91,   0, 44, 72,   0, 23, 48,   0,  0, 11, 
  0,127,166,   0,113,148,   0,101,133,   0, 87,115,   0, 74, 99,   0, 60, 82,   0, 44, 64,   0, 23, 42,   0,  0,  4, 
  0,127,150,   0,113,134,   0,101,119,   0, 87,104,   0, 74, 89,   0, 60, 73,   0, 44, 56,   0, 23, 35,   0,  0,  0, 
  0,125,134,   0,112,118,   0,100,106,   0, 87, 92,   0, 73, 78,   0, 60, 64,   0, 44, 48,   0, 23, 27,   0,  0,  0, 
  0,125,118,   0,112,105,   0,100, 94,   0, 86, 80,   0, 73, 68,   0, 60, 54,   0, 44, 39,   0, 23, 20,   0,  0,  0, 
  0,125,101,   0,111, 90,   0, 99, 80,   0, 86, 69,   0, 73, 58,   0, 59, 45,   0, 44, 30,   0, 23, 11,   0,  0,  0, 
  0,124, 85,   0,111, 75,   0, 99, 66,   0, 86, 56,   0, 73, 45,   0, 59, 34,   0, 44, 20,   0, 23,  1,   0,  0,  0, 
  0,125, 72,   0,111, 62,   0, 99, 56,   0, 86, 46,   0, 73, 36,   0, 60, 26,   0, 44, 12,   0, 23,  0,   0,  0,  0, 
  0,114,188,   0,101,167,   0, 89,150,   0, 77,131,   0, 64,113,   0, 50, 95,   0, 34, 75,   0, 12, 52,   0,  0, 14, 
  0,113,170,   0,101,153,   0, 89,137,   0, 77,120,   0, 64,102,   0, 50, 85,   0, 35, 67,   0, 12, 44,   0,  0,  4, 
  0,113,156,   0,100,139,   0, 89,125,   0, 77,109,   0, 64, 92,   0, 51, 77,   0, 35, 60,   0, 12, 38,   0,  0,  0, 
  0,112,141,   0,100,126,   0, 89,113,   0, 77, 98,   0, 64, 83,   0, 51, 68,   0, 35, 51,   0, 12, 30,   0,  0,  0, 
  0,112,127,   0,100,112,   0, 89,100,   0, 76, 87,   0, 64, 74,   0, 51, 59,   0, 35, 44,   0, 13, 24,   0,  0,  0, 
  0,112,111,   0,100,100,   0, 88, 88,   0, 76, 76,   0, 64, 64,   0, 51, 52,   0, 36, 37,   0, 13, 17,   0,  0,  0, 
  0,111, 96,   0, 99, 85,   0, 88, 76,   0, 76, 64,   0, 64, 53,   0, 51, 41,   0, 36, 27,   0, 13,  6,   0,  0,  0, 
  0,111, 81,   0, 99, 71,   0, 88, 62,   0, 76, 52,   0, 64, 43,   0, 51, 31,   0, 36, 17,   0, 13,  0,   0,  0,  0, 
  0,111, 69,   0, 99, 60,   0, 88, 52,   0, 75, 43,   0, 63, 34,   0, 51, 21,   0, 36,  7,   0, 13,  0,   0,  0,  0, 
  0, 99,177,   0, 88,158,   0, 77,141,   0, 66,123,   0, 53,106,   0, 40, 89,   0, 25, 71,   0,  5, 47,   0,  0,  8, 
  0, 99,160,   0, 88,144,   0, 77,129,   0, 66,112,   0, 54, 97,   0, 41, 80,   0, 26, 62,   0,  5, 40,   0,  0,  0, 
  0, 99,147,   0, 87,132,   0, 78,117,   0, 66,102,   0, 54, 87,   0, 42, 72,   0, 26, 55,   0,  5, 34,   0,  0,  0, 
  0, 99,134,   0, 88,119,   0, 77,107,   0, 66, 92,   0, 54, 78,   0, 42, 64,   0, 27, 48,   0,  5, 27,   0,  0,  0, 
  0, 99,120,   0, 87,107,   0, 78, 94,   0, 66, 81,   0, 54, 68,   0, 42, 55,   0, 27, 40,   0,  6, 20,   0,  0,  0, 
  0, 98,105,   0, 87, 94,   0, 77, 84,   0, 65, 71,   0, 55, 59,   0, 42, 47,   0, 28, 33,   0,  6, 12,   0,  0,  0, 
  0, 98, 93,   0, 87, 81,   0, 77, 72,   0, 66, 61,   0, 54, 49,   0, 42, 37,   0, 28, 24,   0,  6,  4,   0,  0,  0, 
  0, 98, 77,   0, 87, 68,   0, 77, 59,   0, 65, 49,   0, 54, 39,   0, 42, 27,   0, 29, 14,   0,  6,  0,   0,  0,  0, 
  1, 98, 65,   7, 87, 56,   0, 77, 49,   0, 66, 41,   0, 54, 30,   0, 42, 19,   0, 29,  3,   0,  6,  0,   0,  0,  0, 
  0, 84,166,   0, 74,149,   0, 64,134,   0, 53,117,   0, 41,100,   0, 28, 83,   0, 11, 64,   0,  0, 42,   0,  0,  3, 
  0, 84,151,   0, 74,135,   0, 64,121,   0, 53,105,   0, 42, 90,   0, 30, 75,   0, 14, 58,   0,  0, 36,   0,  0,  0, 
  0, 84,138,   0, 74,124,   1, 64,110,   0, 54, 95,   0, 43, 81,   0, 30, 67,   0, 15, 51,   0,  1, 29,   0,  0,  0, 
 14, 84,126,  12, 74,112,   2, 65, 99,   0, 54, 85,   0, 44, 73,   0, 31, 59,   0, 16, 44,   0,  1, 23,   0,  0,  0, 
 16, 84,113,  13, 74,100,   6, 65, 89,   0, 54, 77,   0, 44, 65,   0, 31, 51,   0, 17, 36,   0,  1, 16,   0,  0,  0, 
 24, 84,100,  18, 74, 88,  13, 65, 78,   2, 55, 68,   0, 44, 55,   0, 32, 43,   0, 18, 28,   0,  1,  6,   0,  0,  0, 
 26, 84, 87,  24, 74, 76,  17, 65, 67,   7, 54, 57,   0, 44, 46,   0, 32, 35,   0, 19, 21,   0,  2,  3,   0,  0,  0, 
 30, 84, 74,  28, 74, 64,  20, 65, 55,  12, 55, 46,   0, 44, 35,   0, 32, 24,   0, 18,  9,   0,  1,  0,   0,  0,  0, 
 32, 84, 63,  28, 74, 54,  21, 65, 47,  13, 54, 38,   0, 44, 28,   0, 32, 16,   0, 18,  1,   0,  1,  0,   0,  0,  0, 
 30, 67,155,  20, 58,139,  20, 49,126,  12, 39,110,   0, 27, 94,   0, 13, 77,   0,  0, 60,   0,  0, 37,   0,  0,  0, 
 35, 67,142,  30, 58,126,  23, 50,114,  16, 40, 99,   7, 29, 85,   0, 15, 69,   0,  0, 52,   0,  0, 30,   0,  0,  0, 
 35, 68,131,  30, 59,116,  27, 50,104,  18, 40, 90,   9, 29, 76,   0, 17, 62,   0,  2, 46,   0,  0, 24,   0,  0,  0, 
 37, 69,119,  33, 59,106,  27, 51, 94,  21, 41, 80,   9, 30, 67,   0, 18, 54,   0,  3, 39,   0,  0, 18,   0,  0,  0, 
 40, 69,107,  36, 59, 94,  28, 51, 84,  18, 41, 72,  10, 31, 60,   0, 19, 47,   0,  4, 32,   0,  0, 10,   0,  0,  0, 
 42, 69, 95,  36, 59, 84,  29, 51, 74,  19, 41, 63,  10, 31, 52,   0, 20, 39,   0,  4, 25,   0,  0,  4,   0,  0,  0, 
 43, 69, 83,  38, 60, 73,  32, 51, 62,  23, 42, 53,  11, 31, 42,   0, 20, 31,   0,  5, 17,   0,  0,  1,   0,  0,  0, 
 45, 69, 70,  39, 60, 60,  33, 51, 52,  24, 42, 43,  13, 32, 33,   0, 21, 21,   0,  5,  6,   0,  0,  0,   0,  0,  0, 
 47, 69, 59,  41, 60, 51,  34, 51, 43,  24, 42, 35,  12, 33, 26,   1, 22, 14,   0,  5,  1,   0,  0,  0,   0,  0,  0, 
 46, 48,146,  42, 40,131,  36, 32,118,  27, 22,103,  17,  6, 88,   5,  0, 73,   0,  0, 55,   0,  0, 33,   0,  0,  0, 
 48, 48,133,  44, 40,119,  37, 32,107,  28, 22, 93,  20,  8, 79,   7,  0, 65,   0,  0, 49,   0,  0, 27,   0,  0,  0, 
 48, 50,123,  44, 41,109,  37, 33, 97,  30, 23, 83,  21, 11, 71,   8,  0, 58,   0,  0, 42,   0,  0, 21,   0,  0,  0, 
 49, 51,111,  45, 42, 99,  38, 34, 87,  29, 25, 75,  20, 13, 63,   8,  0, 51,   0,  0, 36,   0,  0, 14,   0,  0,  0, 
 52, 52,100,  44, 43, 89,  38, 35, 79,  29, 26, 68,  19, 15, 56,  10,  1, 43,   0,  0, 28,   0,  0,  6,   0,  0,  0, 
 52, 52, 90,  47, 44, 79,  39, 36, 70,  30, 27, 59,  20, 16, 47,   9,  2, 36,   0,  0, 22,   0,  0,  2,   0,  0,  0, 
 52, 53, 78,  46, 44, 68,  39, 37, 60,  32, 27, 49,  22, 17, 39,  10,  3, 28,   0,  0, 12,   0,  0,  0,   0,  0,  0, 
 53, 53, 66,  47, 44, 57,  40, 36, 48,  32, 27, 39,  22, 18, 30,   9,  4, 18,   0,  0,  3,   0,  0,  0,   0,  0,  0, 
 54, 53, 57,  48, 45, 49,  41, 37, 41,  33, 28, 32,  22, 19, 23,  11,  6, 10,   1,  0,  0,   0,  0,  0,   0,  0,  0
];

function AdobeCMYK_to_sRGB1( c,  m,  y,  k)
{
	var fix_c = c << 8;	
	var fix_m = m << 8;
	var fix_y = y << 8;
	var fix_k = k << 8;

	// Use a 9 point sample to transform DeviceCMYK values to RGB
	// First, get a sample point closest to this point
	var c_index = (fix_c + 4096) >> 13;
	var m_index = (fix_m + 4096) >> 13;
	var y_index = (fix_y + 4096) >> 13;
	var k_index = (fix_k + 4096) >> 13;

	// lookup using the sample table
	var pos = (c_index*9*9*9 + m_index*9*9 + y_index*9 + k_index) * 3;
	var fix_r = g_CMYKSamples[pos] << 8;
	var fix_g = g_CMYKSamples[pos+1] << 8;
	var fix_b = g_CMYKSamples[pos+2] << 8;

	// Get next closest sample index
	var c1_index = fix_c >> 13;
	if (c1_index == c_index) c1_index = c1_index == 8 ? c1_index - 1 : c1_index + 1;
	var m1_index = fix_m >> 13;
	if (m1_index == m_index) m1_index = m1_index == 8 ? m1_index - 1 : m1_index + 1;
	var y1_index = fix_y >> 13;
	if (y1_index == y_index) y1_index = y1_index == 8 ? y1_index - 1 : y1_index + 1;
	var k1_index = fix_k >> 13;
	if (k1_index == k_index) k1_index = k1_index == 8 ? k1_index - 1 : k1_index + 1;

	// Get adjacent sample position
	var c1_pos = pos + (c1_index - c_index)*9*9*9*3;
	var m1_pos = pos + (m1_index - m_index)*9*9*3;
	var y1_pos = pos + (y1_index - y_index)*9*3;
	var k1_pos = pos + (k1_index - k_index)*3;

	// Now calculate the difference
	var c_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[c1_pos];
	var c_g_delta = g_CMYKSamples[pos+1] - g_CMYKSamples[c1_pos+1];
	var c_b_delta = g_CMYKSamples[pos+2] - g_CMYKSamples[c1_pos+2];
	var m_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[m1_pos];
	var m_g_delta = g_CMYKSamples[pos+1] - g_CMYKSamples[m1_pos+1];
	var m_b_delta = g_CMYKSamples[pos+2] - g_CMYKSamples[m1_pos+2];
	var y_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[y1_pos];
	var y_g_delta = g_CMYKSamples[pos+1] - g_CMYKSamples[y1_pos+1];
	var y_b_delta = g_CMYKSamples[pos+2] - g_CMYKSamples[y1_pos+2];
	var k_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[k1_pos];
	var k_g_delta = g_CMYKSamples[pos+1] - g_CMYKSamples[k1_pos+1];
	var k_b_delta = g_CMYKSamples[pos+2] - g_CMYKSamples[k1_pos+2];

	// Now adjust the value proportionally
	var c_rate = (fix_c - (c_index << 13)) * (c_index - c1_index);
	fix_r += c_r_delta * c_rate / 32;
	fix_g += c_g_delta * c_rate / 32;
	fix_b += c_b_delta * c_rate / 32;
	var m_rate = (fix_m - (m_index << 13)) * (m_index - m1_index);
	fix_r += m_r_delta * m_rate / 32;
	fix_g += m_g_delta * m_rate / 32;
	fix_b += m_b_delta * m_rate / 32;
	var y_rate = (fix_y - (y_index << 13)) * (y_index - y1_index);
	fix_r += y_r_delta * y_rate / 32;
	fix_g += y_g_delta * y_rate / 32;
	fix_b += y_b_delta * y_rate / 32;
	var k_rate = (fix_k - (k_index << 13)) * (k_index - k1_index);
	fix_r += k_r_delta * k_rate / 32;
	fix_g += k_g_delta * k_rate / 32;
	fix_b += k_b_delta * k_rate / 32;

	// Clip output to 0-1. TESTDOC: Bug#1295, bug#1562
	if (fix_r < 0) fix_r = 0;
	if (fix_g < 0) fix_g = 0;
	if (fix_b < 0) fix_b = 0;

	R = fix_r >> 8;
	G = fix_g >> 8;
	B = fix_b >> 8;

    return [R,G,B];
}

function AdobeCMYK_to_sRGB( c,  m,  y,  k)
{
	var c1 = Math.round(c * 255);
	var m1 = Math.round(m * 255);
	var y1 = Math.round(y * 255);
	var k1 = Math.round(k * 255);
	
	var rel = AdobeCMYK_to_sRGB1(c1, m1, y1, k1);
	R = 1.0 * rel[0] / 255;
	G = 1.0 * rel[1] / 255;
	B = 1.0 * rel[2] / 255;
    return [R,G,B];
}



//spaceType: 1 for DEVICEGRAY,2 for DEVICERGB, 3 DEVICECMYK, 7 PDFCS_ICCBASED
function GetRGBFromDeviceClrSpace(spaceType, clrBuf) {
    var R = 0;
    var G = 0;
    var B = 0;
    if (spaceType == 1) {
        R = clrBuf[0];
        if (R < 0) R = 0; else if (R > 1) R = 1;
        G = B = R;

        
    } else if (spaceType == 2) {
        R = clrBuf[0];
        if (R < 0) R = 0; else if (R > 1) R = 1;
        G = clrBuf[1];
        if (G < 0) G = 0; else if (G > 1) G = 1;
        B = clrBuf[2];
        if (B < 0) B = 0; else if (B > 1) B = 1;
    } else if (spaceType == 3) {
        if (clrBuf.length < 4) return [0, 0, 0];
        var rel = AdobeCMYK_to_sRGB(clrBuf[0], clrBuf[1], clrBuf[2], clrBuf[3]);
            return rel;
        } else if (spaceType == 7) {
            R = clrBuf[0];
            if (R < 0) R = 0; else if (R > 1) R = 1;
            G = clrBuf[1];
            if (G < 0) G = 0; else if (G > 1) G = 1;
            B = clrBuf[2];
            if (B < 0) B = 0; else if (B > 1) B = 1;
    } else {
        R = G = B = 0;
    }
    return [R, G, B];
}

//function based shading------------------------------------------------------------------------------------------------------------

function _DrawFuncShading(shadingpattern, mtObj2bmp, cnvs, rect_bmp, alpha) {
    var ctx = cnvs.getContext("2d");

    var xmin = 0;
    var ymin = 0;
    var xmax = 1;
    var ymax = 1;

    if (shadingpattern.m_Domain != undefined && shadingpattern.m_Domain != null && shadingpattern.m_Domain.length === 4) {
        xmin = shadingpattern.m_Domain[0];
        xmax = shadingpattern.m_Domain[1];
        ymin = shadingpattern.m_Domain[2];
        ymax = shadingpattern.m_Domain[3];
    }

    var mt = new PDMatrix();
    mt.SetReverse(mtObj2bmp); 	// from bitmap coord to pattern coord
    var reverse_matrix = new PDMatrix();
    reverse_matrix.SetReverse(shadingpattern.m_DomainMatrix);
    // from pattern to domain coord
    //matrix.Concat(reverse_matrix.GetA(), reverse_matrix.GetB(), reverse_matrix.GetC(), reverse_matrix.GetD(), reverse_matrix.GetE(), reverse_matrix.GetF(),false);
    var matrix = PDMatrix.prototype.Concat2mt(mt, reverse_matrix);
    var width = cnvs.width;
	var height = cnvs.height;

	var pitch = width*4;
	var Bpp = 4;

    var total_results = 0;
    for (var j = 0; j < shadingpattern.m_nFuncs; j++) {
        if (shadingpattern.m_function[j] != undefined && shadingpattern.m_function[j] != null)
            total_results += shadingpattern.m_function[j].CountOutputs();
    }

    var result_array = [];
    //var imgData = ctx.getImageData(rect_bmp[0], rect_bmp[1], rect_bmp[2] - rect_bmp[0], rect_bmp[3] - rect_bmp[1]);
    // Paint one by one
    for (var row = 0; row < (height); row++) {
        for (var column = 0; column < (width); column++) {
			// transform to pattern coord
			var x = column, y = (row);
			var rel = matrix.TransFormPoint(x, y);

			// check if in the domain
			if (rel[0] < xmin || rel[0] > xmax|| rel[1] < ymin || rel[1] > ymax)
				continue;

			// get function values
			var input =[];//2; 
            var offset = 0;
			input[0] = rel[0];
			input[1] = rel[1];
			for (var j = 0; j < shadingpattern.m_nFuncs; j ++) {
                if (shadingpattern.m_function[j] != undefined && shadingpattern.m_function[j] != null) {
              
				    var nresults = 0;
                    var func = shadingpattern.m_function[j];
                    var arrRel = [];
                    var arr = func.Call(input, 2, arrRel);
                    if (arr[0] === true) {
                        for (var p = 0; p < arr[1]; p++)
                            result_array[offset + p] = arrRel[p];
                        offset += arr[1];
                    }
			    }
            }
            var arrRGB = GetRGBFromDeviceClrSpace(shadingpattern.m_clrSpace, result_array);

            var R = parseInt(arrRGB[0] * 255);
            if(R < 0)R = 0; 
            if(R>255) R = 255;

            var G = parseInt(arrRGB[1] * 255);
            if(G < 0) G = 0; 
            if(G>255) G = 255;
            var B = parseInt(arrRGB[2] * 255);
            if(B < 0) B = 0;
            if (B > 255) B = 255;
            var fillRGB = "RGB(" + R + "," + G + "," + B + ")";

         //   ctx.save();
            ctx.setTransform(1,0,0,1,0,0);
            var fillRGB = "RGB(" + R + "," +G + "," + B + ")";
            ctx.globalAlpha = alpha;
            ctx.fillStyle = fillRGB;
           ctx.fillRect(x, y, 1, 1);
            /*
            imgData.data[row * pitch + column * 4] = R;
            imgData.data[row * pitch + column * 4+1] = G;
            imgData.data[row * pitch + column * 4+2] = B;
            imgData.data[row * pitch + column * 4 + 3] = 255;
            ctx.putImageData(imgData, rect_bmp[0], rect_bmp[1]);
            */
          //  ctx.restore();	
		}
	}
}

function _GetScanlineIntersect(y, x1, y1, x2, y2) {
    if (y1 == y2) return [false, 0];
    if (y1 < y2) {
        if (y < y1 || y > y2) return [false, 0];
    } else {
        if (y < y2 || y > y1) return [false, 0];
    }
    var x = x1 + ((x2 - x1) * (y - y1) / (y2 - y1));
    return [true, x];
}

//Axial shading----------------------------------------------------------------------------------------------------------------------

function SetAxialGradient(grd, shadingpattern) {

    var bounds = [0, 1];
    if (shadingpattern.m_function[0].m_Bounds != undefined && shadingpattern.m_function[0].m_Bounds != null && shadingpattern.m_function[0].m_Bounds.length > 1) {
        bounds = shadingpattern.m_function[0].m_Bounds;

    } else if (shadingpattern.m_function[0].m_Domains != undefined && shadingpattern.m_function[0].m_Domains != null && shadingpattern.m_function[0].m_Domains.length > 1) {
        bounds = shadingpattern.m_function[0].m_Domains;
    }

    var n = bounds.length;
    for (var i = 0; i < n; i++) {

        var func = shadingpattern.m_function[0];
        var arr = new Array();
        arr[0] = bounds[i];
        var tempResult = new Array();
        func.Call(arr, 1, tempResult);
        var arrRGB = GetRGBFromDeviceClrSpace(shadingpattern.m_clrSpace, tempResult);
        var r = parseInt(arrRGB[0] * 255);
        if (r < 0) r = 0;
        if (r > 255) r = 255;
        var g = parseInt(arrRGB[1] * 255);
        if (g < 0) g = 0;
        if (g > 255) g = 255;
        var b = parseInt(arrRGB[2] * 255);
        if (b < 0) b = 0;
        if (b > 255) b = 255;
        var fillRGB = "RGB(" + r + "," + g + "," + b + ")";
        grd.addColorStop(bounds[i], fillRGB);
    }
}

function _DrawAxialShading(cnvs, finalMatrix, shadingpattern, rcDeviceDest, alpha) {
    var start_x = shadingpattern.m_Cooords[0];
    var start_y = shadingpattern.m_Cooords[1];
    var end_x = shadingpattern.m_Cooords[2];
    var end_y = shadingpattern.m_Cooords[3];
    var func = shadingpattern.m_function[0];
    if (shadingpattern.m_nFuncs == 1 && (func instanceof PDStitchFunc || func instanceof PDExpIntFunc)) {
        var ctx = cnvs.getContext("2d");
        //ctx.setTransform(finalMatrix.a, finalMatrix.b,finalMatrix.c,finalMatrix.d,finalMatrix.e,finalMatrix.f);
        var rel1 = finalMatrix.TransFormPoint(start_x, start_y);
        var rel2 = finalMatrix.TransFormPoint(end_x, end_y);
        var grd = ctx.createLinearGradient(rel1[0], rel1[1], rel2[0], rel2[1]);

        SetAxialGradient(grd, shadingpattern);
        ctx.fillStyle = grd;
        ctx.setTransform(1, 0, 0, 1, 0, 0);
        ctx.fillRect(rcDeviceDest[0], rcDeviceDest[1], rcDeviceDest[2] - rcDeviceDest[0], rcDeviceDest[3] - rcDeviceDest[1]);
        return;
    }    
    var t_min = 0;
    var t_max = 1.0;
    if (shadingpattern.m_Domain != undefined && shadingpattern.m_Domain != null && shadingpattern.m_Domain.length > 1) {
        t_min = shadingpattern.m_Domain[0];
        t_max = shadingpattern.m_Domain[1];
    }

    var bStartExtend = false;
    var bEndExtend = false;
    if (shadingpattern.m_Extend != undefined && shadingpattern.m_Extend != null && shadingpattern.m_Extend.length >1) {
        bStartExtend = shadingpattern.m_Extend[0];
        bEndExtend = shadingpattern.m_Extend[1];
    }
    var x_span = end_x - start_x;
    var y_span = end_y - start_y;
    var axis_len_square = (x_span * x_span) + (y_span * y_span);

    var mt = new PDMatrix();
    mt.SetReverse(finalMatrix);

    var total_results = 0;
    for (var j = 0; j < shadingpattern.m_nFuncs; j++) {
        if (shadingpattern.m_function[j] != undefined && shadingpattern.m_function[j] != null)
            total_results += shadingpattern.m_function[j].CountOutputs();
    }

    var result_array = [];
    var rgb_array = [];
    for (var i = 0; i < 256; i++) {
        var input = (t_max - t_min) * i / 256 + t_min;
        var offset = 0;
        for (var j = 0; j < shadingpattern.m_nFuncs; j++) {
            if (shadingpattern.m_function[j] != undefined && shadingpattern.m_function[j] != null) {
                var nresults = 0;
                var func = shadingpattern.m_function[j];
                var arrInput = [];
                arrInput[0] = input;
                var arrRel = [];
                var arr = func.Call(arrInput, 1, arrRel);
                if (arr[0] === true) {
                    for (var p = 0; p < arr[1]; p++)
                        result_array[offset + p] = arrRel[p];
                    offset += arr[1];
                }
            }
        }

        var arrRGB = GetRGBFromDeviceClrSpace(shadingpattern.m_clrSpace, result_array);

        var r = parseInt(arrRGB[0] * 255);
        if (r < 0) r = 0;
        if (r > 255) r = 255;
        var g = parseInt(arrRGB[1] * 255);
        if (g < 0) g = 0;
        if (g > 255) g = 255;
        var b = parseInt(arrRGB[2] * 255);
        if (b < 0) b = 0;
        if (b > 255) b = 255;
        rgb_array[i * 3] = r;
        rgb_array[i * 3 + 1] = g;
        rgb_array[i * 3 + 2] = b;
    }

    // Now we figure out pixels one by one
    var pitch = cnvs.width * 4;
    var Bpp = 4;
    var ctx = cnvs.getContext("2d");
    ctx.save();
    for (var row = rcDeviceDest[1]; row < rcDeviceDest[3]/*cnvs.height*/; row++) {
        //FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
        var c = 0;
        for (var column = rcDeviceDest[0]; column < rcDeviceDest[2]/*cnvs.width*/; column++) {
            // transfrom bitmap coord to shading coord
            var x = column;
            var y = row;
            var rel = mt.TransFormPoint(x, y);
            var scale = (((rel[0] - start_x) * x_span) + ((rel[1] - start_y) * y_span)) / axis_len_square;

            // get a index from the t value
            var tt = ((scale) * (256 - 1));
            var index = 0;
            index = parseInt(tt);
            if (index < 0) {
                if (!bStartExtend) continue;
                index = 0;
            } else if (index >= 256) {
                if (!bEndExtend) continue;
                index = 256 - 1;
            }
            ctx.setTransform(1, 0, 0, 1, 0, 0);
			var fillRGB = "RGB(" + rgb_array[index*3] + "," + rgb_array[index*3+1] + "," + rgb_array[index*3+2] + ")";
            ctx.globalAlpha = alpha;
            ctx.fillStyle = fillRGB;
            ctx.fillRect(x, y, 1, 1);
        }
    }
    ctx.restore();
}

function CalcRadialClip(x0, y0, r0, x1, y1, r1) {
    var rDis = parseInt(Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2)));
    var rBig = r0 > r1 ? r0 : r1;
    var rLittle = r0 > r1 ? r1 : r0;

    var arrPath = [];
    arrPath[0] = false;
    var bContain = (rDis + rLittle <= rBig) ? true : false;
    if (bContain) {//if contain, we just use the big circle as the clip area;
        arrPath[0] = true;
        arrPath[1] = [r0 == rBig ? x0 : x1, r0 == rBig ? y0 : y1, rBig];
        return arrPath;
    }
    //calculate point of contact
    var StartX = x0 > x1 ? x1 : x0;
    var StartR = StartX == x0 ? r0 : r1;
    var StartY = StartX == x0 ? y0 : y1;
    var EndX = StartX == x0 ? x1 : x0;
    var EndY = StartX == x0 ? y1 : y0;
    var EndR = StartX == x0 ? r1 : r0;
    var dx = StartX - EndX;
    var dy = StartY - EndY;
    var dr = StartR - EndR;

    var d2 = Math.pow(dx, 2) + Math.pow(dy, 2);
    var d = Math.sqrt(d2);////distance between 01 to 02 
    var s = dy / d;
    var c = dx / d;

    //pow of the distance between 01 to point of contact
    var dtemp2 = d2 - Math.pow((EndR - StartR), 2) + Math.pow(StartR, 2);

    //f
    var x = EndX - EndR;
    var y = EndY + EndR;
    var curY = EndY;
    var EndR2 = Math.pow(EndR, 2);
    var bFind = false;
    var point = [];
    var pt = [];
    var dtt = dtemp2;
    for (var xn = x; xn <= EndX + EndR; xn++)
    {
        var dx2 = Math.pow(EndX - xn, 2);
        var dt = EndR2;
        for (var yn = curY; yn <= y; yn++)
        {
           // if(yn <= curY) continue;
            var temp = Math.abs(dx2 + Math.pow(yn - EndY, 2) - EndR2);
            if (dt > temp) {
                dt = temp;
                point[0] = xn;
                point[1] = yn;
            }
        }
        curY = point[1];
        var t = Math.abs(dtemp2 - (Math.pow(point[0] - StartX, 2) + Math.pow(point[1] - StartY, 2)));
        if (t < dtt) {
            dtt = t;
            pt[0] = point[0];
            pt[1] = point[1];
               // bFind = true;
            //    point = [xn, yn];
              //  break;
            }
         //   break;
    }
    var k = (EndY - StartY) / (EndX - StartX);
        var yn1 = (pt[0] * k + StartY - StartX * k - pt[1]) / (1 + Math.pow(k, 2));
        var xn1 = (2 * k * (pt[1] - StartY + StartX * k) - pt[0] * (k * k - 1)) / (1 + Math.pow(k, 2));
        arrPath[1] = [StartX - StartR, StartY + StartR];
        arrPath[2] = point;
        arrPath[3] = [xn1, yn1];
        arrPath[4] = [StartX - StartR, StartY - StartR];
    return arrPath;
}

//Radial shading---------------------------------------------------------------------------------------------------------------------
function _DrawRadialShading(shadingpattern, mtObj2Device, clipRect, cnvs, alpha) {
    if (shadingpattern.m_Cooords == undefined && shadingpattern.m_Cooords == null && shadingpattern.m_Cooords.length < 6)
        return;
 
    var mtObj2Bmp = new PDMatrix();
    mtObj2Bmp.Clon(mtObj2Device);
    var matrix = new PDMatrix();
    matrix.SetReverse(mtObj2Bmp);

    var start_x = shadingpattern.m_Cooords[0];
    var start_y = shadingpattern.m_Cooords[1];
    var start_r = shadingpattern.m_Cooords[2];
    var end_x = shadingpattern.m_Cooords[3];
    var end_y = shadingpattern.m_Cooords[4];
    var end_r = shadingpattern.m_Cooords[5];
    var bStartExtend = false; var bEndExtend = false;
    if (shadingpattern.m_Extend != undefined && shadingpattern.m_Extend != null && shadingpattern.m_Extend.length > 1) {
        bStartExtend = shadingpattern.m_Extend[0];
        bEndExtend = shadingpattern.m_Extend[1];
    }

   

    var func = shadingpattern.m_function[0];
    if (shadingpattern.m_nFuncs == 1 && (func instanceof PDStitchFunc || func instanceof PDExpIntFunc) && (bStartExtend && bEndExtend)) {
        var ctx = cnvs.getContext("2d");
        //ctx.setTransform(finalMatrix.a, finalMatrix.b,finalMatrix.c,finalMatrix.d,finalMatrix.e,finalMatrix.f);
        var rel1 = mtObj2Device.TransFormPoint(start_x, start_y);
        var r1 = mtObj2Device.TransformXDistance(start_r);
        var rel2 = mtObj2Device.TransFormPoint(end_x, end_y);
        var r2 = mtObj2Device.TransformXDistance(end_r);
        var grd = ctx.createRadialGradient(rel1[0], rel1[1], r1, rel2[0], rel2[1], r2);
        SetAxialGradient(grd, shadingpattern);
        ctx.save();
        ctx.setTransform(1, 0, 0, 1, 0, 0);
        ctx.fillStyle = grd;
        ctx.fillRect(clipRect[0], clipRect[1], clipRect[2] - clipRect[0], clipRect[3] - clipRect[1]);
        ctx.restore();
        return;
    }

 //   var mt = new PDMatrix();
  //  mt.SetReverse(mtObj2Bmp);
    var t_min = 0; var t_max = 1;

    if(shadingpattern.m_Domain != undefined && shadingpattern.m_Domain != null && shadingpattern.m_Domain.length > 1)
    {
        t_min = shadingpattern.m_Domain[0];
        t_min = shadingpattern.m_Domain[1];
    }

    // Get result length from all functions
	var total_results = 0;
    var nFuncs = shadingpattern.m_nFuncs;
	for (var j = 0; j < nFuncs; j ++) {
        var func = shadingpattern.m_function[j];
        if (func != undefined && func != null) {
            total_results += func.CountOutputs();
        }
	}

	var result_array = [];
    var rgb_array = [];
    for (var i = 0; i < 256; i++) {
        var input = (t_max - t_min) * i / 256 + t_min;
        var offset = 0;
        for (var j = 0; j < nFuncs; j++) {
            var func = shadingpattern.m_function[j];
            if (func != undefined && func != null) {
                var nresults = 0;
                var arrInput = [];
                arrInput[0] = input;
                var arrRel = [];
                var arr = func.Call(arrInput, 1, arrRel);
                if (arr[0] === true) {
                    for (var p = 0; p < arr[1]; p++)
                        result_array[offset + p] = arrRel[p];
                    offset += arr[1];
                }
            }
        }

       // shadingpattern.m_clrSpace = 3;
        var arrRGB = GetRGBFromDeviceClrSpace(shadingpattern.m_clrSpace, result_array);
        var r = parseInt(arrRGB[0] * 255);
        if (r < 0) r = 0;
        if (r > 255) r = 255;
        var g = parseInt(arrRGB[1] * 255);
        if (g < 0) g = 0;
        if (g > 255) g = 255;
        var b = parseInt(arrRGB[2] * 255);
        if (b < 0) b = 0;
        if (b > 255) b = 255;
        rgb_array[i * 3] = r;
        rgb_array[i * 3 + 1] = g;
        rgb_array[i * 3 + 2] = b;
    }

    var a = ((start_x - end_x) * (start_x - end_x)) + ((start_y - end_y) * (start_y - end_y)) - ((start_r - end_r)*(start_r - end_r));

  //  var width = cnvs.width;//
  //  var height =  cnvs.height; //
    var bDecreasing = false; // start_r > end_r;
    if (start_r > end_r) {
        //(int)FXSYS_sqrt((FXSYS_Mul(start_x-end_x, start_x-end_x) + FXSYS_Mul(start_y-end_y, start_y-end_y)));
        var x2 = (start_x - end_x) * (start_x - end_x);
        var y2 = (start_y - end_y) * (start_y - end_y);
        var length = Math.floor(Math.sqrt(x2 + y2));
        if (length < start_r - end_r)
            bDecreasing = true;
    }

    var temp = [];
    var ctx = cnvs.getContext("2d");
    for (var row = clipRect[1]; row < clipRect[3]; row++) {
        for (var column = clipRect[0]; column < clipRect[2]; column++) {
            var x = column;
            var y = row;
            var rel = matrix.TransFormPoint(x, y);
            // get b and c
			var b = -2 * ((rel[0]-start_x)*(end_x-start_x) + ((rel[1]-start_y)* (end_y-start_y)) + ((start_r)*(end_r-start_r)));
			var c = ((rel[0]-start_x)* (rel[0]-start_x)) + ((rel[1]-start_y)*(rel[1]-start_y)) - (start_r*start_r);
			var s = 0;
			if (a == 0) {
				// It can happen, in this case we just need to solve a linear equation
				// TESTDOC: Bug #5957 - dvacw60-52_mn.pdf 
			    //s = ((parseInt(-c/b)) >>> 24);
			    s = (-c) / b;
			} else {
				var b2_4ac = (b* b) - 4 * (a*c);
				if (b2_4ac < 0) continue;	// Not on any circle.

                //var rt = (Math.sqrt(b2_4ac));
				var root = Math.sqrt(b2_4ac);// (rt << 16);
				// Get s values. Note we can get two values, we order them from small to large
				var s1 = 0;
                var s2 = 0;
				if (a > 0) {
					s1 = (-b - root)/(2*a);
					s2 = (-b + root) / (2*a);
				} else {
					s2 = (-b - root)/(2*a);
					s1 = (-b + root)/(2*a);
				}
				// The rule for choosing one correct s: the last valid value prevail
				if (bDecreasing) {
					if (s1 >= 0 || bStartExtend) s = (s1);
					else s = (s2);
				} else {
					if (s2 <= 1 || bEndExtend) s = (s2);
					else s = (s1);
				}
				// the radii has to be larger than 0
				if ((start_r) + s * (end_r - start_r) < 0) continue;
			}

			// get a index from the t value
			var index = parseInt(s * 255);
			if (index < 0) {
				if (!bStartExtend) continue;
				index = 0;
			}
			if (index >= 256) {
				if (!bEndExtend) continue;
				index = 256 - 1;
			}
            //   ctx.save();
            ctx.setTransform(1, 0, 0, 1, 0, 0);
        //    ctx.save();
            var fillRGB = "RGB(" + rgb_array[index * 3] + "," + rgb_array[index * 3 + 1] + "," + rgb_array[index * 3+2] + ")";
            ctx.globalAlpha = alpha*255;
            ctx.fillStyle = fillRGB;
            ctx.fillRect(x, y, 1, 1);
//   ctx.restore();

        }

    }

    
    
}

//FreeGouraud Shading----------------------------------------------------------------------------------------------------------------

function _DrawGouraud(imgData, bmpWidth, bmpHeight, alpha, arrTriangle3, mtObj2Device, cnvs) {
    var ctx = cnvs.getContext("2d");
    var triangle = arrTriangle3[0];
    var t_xy = mtObj2Device.TransFormPoint(triangle.m_x, triangle.m_y);
    var min_y = t_xy[1];//triangle.m_y;
    var max_y = t_xy[1]; //triangle.m_y;
    for (var i = 1; i < 3; i++) {
        var t = arrTriangle3[i];
        var rel = mtObj2Device.TransFormPoint(t.m_x, t.m_y);
        if (min_y > rel[1]) min_y = rel[1];
        if (max_y < rel[1]) max_y = rel[1];
    }
    if (min_y == max_y) return;
    var min_yi = Math.floor(min_y);
    var max_yi = Math.ceil(max_y);
    if (min_yi < 0) min_yi = 0;

    if (max_yi >= bmpHeight) max_yi = bmpHeight - 1;

    // do horizontal scan
    for (var y = min_yi; y <= max_yi; y++) {
        // Get intersections of the triangle sides
        var nIntersects = 0;
        var inter_x = [];
        var r = [];
        var g = [];
        var b = [];
        for (var i = 0; i < 3; i++) {
            var vertex1 = arrTriangle3[i]; //MeshVertex
            var vertex2 = arrTriangle3[(i + 1) % 3];
            var rel1 = mtObj2Device.TransFormPoint(vertex1.m_x, vertex1.m_y);
            var rel2 = mtObj2Device.TransFormPoint(vertex2.m_x, vertex2.m_y);
            var res_Intersect = _GetScanlineIntersect(y, rel1[0],rel1[1],rel2[0], rel2[1]);
            if (!res_Intersect[0]) continue;
            inter_x[nIntersects] = res_Intersect[1];

            
            var arrClr = vertex1.GetRGB();
            var arrClr2 = vertex2.GetRGB();
            r[nIntersects] = arrClr[0] + (arrClr2[0] - arrClr[0]) * (y - rel1[1]) / (rel2[1] - rel1[1]);
            g[nIntersects] = arrClr[1] + (arrClr2[1] - arrClr[1]) * (y - rel1[1]) / (rel2[1] - rel1[1]);
            b[nIntersects] = arrClr[2] + (arrClr2[2] - arrClr[2]) * (y - rel1[1]) / (rel2[1] - rel1[1]);
            nIntersects++;
        }
        if (nIntersects != 2) continue;

        // Find minimum and maximum X position
        // We also need to figure which one is the start point and which one is end point
        // TESTDOC: Bug #2818 - sh type4.pdf
        var min_x = 0;
        var max_x = 0;
        var start_index = 0;
        var end_index = 0;
        if (inter_x[0] < inter_x[1]) {
            min_x = Math.floor(inter_x[0]);
            max_x = Math.ceil(inter_x[1]);
            start_index = 0;
            end_index = 1;
        } else {
            min_x = Math.floor(inter_x[1]);
            max_x = Math.ceil(inter_x[0]);
            start_index = 1;
            end_index = 0;
        }
        var start_x = min_x;
        var end_x = max_x;
        if (start_x < 0) start_x = 0;
        if (end_x > bmpWidth) end_x = bmpWidth;

        // Fill in the bitmap buffer pixel by pixel
        var toPixel = y * (bmpWidth * 4) + start_x * 4;

        var r_unit = (r[end_index] - r[start_index]) / (max_x - min_x);
        var g_unit = (g[end_index] - g[start_index]) / (max_x - min_x);
        var b_unit = (b[end_index] - b[start_index]) / (max_x - min_x);
        var R = r[start_index] + (start_x - min_x) * r_unit;
        var G = g[start_index] + (start_x - min_x) * g_unit;
        var B = b[start_index] + (start_x - min_x) * b_unit;
        for (var x = start_x; x < end_x; x++) {
            R += r_unit;
            G += g_unit;
            B += b_unit;

            var r = parseInt(R * 255);
            var g = parseInt(G * 255);
            var b = parseInt(B * 255);
            ctx.setTransform(1, 0, 0, 1, 0, 0);
            var fillRGB = "RGB(" + r +"," + g +"," + b +")";
            ctx.globalAlpha = alpha;
            ctx.fillStyle = fillRGB;
            ctx.fillRect(x, y, 1, 1);
        }
    }
}

function _DrawFreeGouraudShading(imgData, bmpWidth, bmpHeight, obj2bmpMatrix, arrMesh, alpha, cnvs) {
    var nM = arrMesh.length;
    if (0 == nM) return;
    var triangle = [];
	var i = 0; 
    while(i<nM) {
        var mesh = arrMesh[i]; 
        if (mesh.GetFlag() == 0) {
            triangle[0] = mesh;
            for (var j = 1; j < 3; j++) {
        		++i;
                var m = arrMesh[i];
                triangle[j] = m;
            }
        }
        else {
            if (mesh.GetFlag() == 1)
            // a new triangle with last two verticies
                triangle[0] = triangle[1];
     
            triangle[1] = triangle[2];
            triangle[2] = mesh;
            // We just need transform the new vertex.
            // TESTDOC: Bug#1821 e.pdf
        }
        ++i;
        
         _DrawGouraud(imgData, bmpWidth, bmpHeight, alpha, triangle, obj2bmpMatrix, cnvs);

    }
   
}
//Lattice Gouraud Shading-----------------------------------------------------------------------------------------------------------------
function _DrawLatticeGouraudShading(imgData, bmpWidth, bmpHeight, obj2bmpMatrix, arrMesh, rowVerts, alpha,cnvs) {
    if (rowVerts < 2) return;
    var n = arrMesh.length;
    var i = 0;
    var arrLastRow = [];
    var arrThisRow = [];
    var last_index = i;
    var bAdd = true;
    while (1) {
        if (i >= n) break;
        for (var j = 0; j < rowVerts; j++) {
            arrLastRow[j] = arrMesh[last_index];
            ++last_index;
            if (bAdd)
                i++;
        }
        if (i >= n) break;
        if (i >= 3) bAdd = false;

        for (var k = 0; k < rowVerts; k++) {
            arrThisRow[k] = arrMesh[i];
            i++;
        }
        
        last_index = i - rowVerts;

        var triangle = [3];
        for (var p = 1; p < rowVerts; p++) {
            triangle[0] = arrLastRow[p];
            triangle[1] = arrThisRow[p - 1];
            triangle[2] = arrLastRow[p - 1];
            _DrawGouraud(imgData, bmpWidth, bmpHeight, alpha, triangle, obj2bmpMatrix, cnvs);
            triangle[2] = arrThisRow[p];
            _DrawGouraud(imgData, bmpWidth, bmpHeight, alpha, triangle, obj2bmpMatrix, cnvs);
        }
    }
}

//Coon Patch Meshes--------------------------------------------------------------------------------------------------------------------
function Coon_BezierCoeff() {
    this.a = 0;
    this.b = 0;
    this.c = 0;
    this.d = 0;

    this.FromPoints = function (p0, p1, p2, p3) {
        this.a = 3 * p1 - 3 * p2 + p3 - p0;
        this.b = 3 * p0 - 6 * p1 + 3 * p2;
        this.c = -3 * p0 + 3 * p1;
        this.d = p0;
    };

    this.first_half = function () {
        var result = new Coon_BezierCoeff();
        result.a = this.a / 8;
        result.b = this.b / 4;
        result.c = this.c / 2;
        result.d = this.d;
        return result;
    };

    this.second_half = function () {
        var result = new Coon_BezierCoeff();
        result.a = this.a / 8;
        result.b = 3 * this.a / 8 + this.b / 4;
        result.c = 3 * this.a / 8 + this.b / 2 + this.c / 2;
        result.d = this.a / 8 + this.b / 4 + this.c / 2 + this.d;
        return result;
    };

    this.GetPoints = function () {
        var p = new Array();
        p[0] = this.d;
        p[1] = this.c / 3 + p[0];
        p[2] = this.b / 3 - p[0] + 2 * p[1];
        p[3] = this.a + p[0] - 3 * p[1] + 3 * p[2];
        return p;
    };

    this.GetPointsReverse = function () {
        var rel = new Array();
        rel[3] = this.d;
        rel[2] = this.c / 3 + rel[3];
        rel[1] = this.b / 3 - rel[3] + 2 * rel[2];
        rel[0] = this.a + rel[3] - 3 * rel[2] + 3 * rel[1];
        return rel;
    };

    this.BezierInterpol = function (C1, C2, D1, D2) {
        this.a = (D1.a + D2.a) / 2;
        this.b = (D1.b + D2.b) / 2;
        this.c = (D1.c + D2.c) / 2 - (C1.a / 8 + C1.b / 4 + C1.c / 2) + (C2.a / 8 + C2.b / 4) + (-C1.d + D2.d) / 2 - (C2.a + C2.b) / 2;
        this.d = C1.a / 8 + C1.b / 4 + C1.c / 2 + C1.d;
    };

    this.Distance = function () {
        var dis = this.a + this.b + this.c;
        return dis < 0 ? -dis : dis;
    };
}

function Coon_Bezier() {
    this.x = null;// new Coon_BezierCoeff();
    this.y = null; //new Coon_BezierCoeff(); 
    this.InitXY = function () {
        this.x = new Coon_BezierCoeff();
        this.y = new Coon_BezierCoeff();
    };

    this.FromPoints = function (x0, y0, x1, y1, x2, y2, x3, y3) {
        if (this.x != null && this.y != null) {
            this.x.FromPoints(x0, x1, x2, x3);
            this.y.FromPoints(y0, y1, y2, y3);
        }
    };

    this.first_half = function () {
        var result = new Coon_Bezier();
        result.InitXY();
        if (this.x != null && this.y != null) {
            result.x = this.x.first_half();
            result.y = this.y.first_half();
        }
        return result;
    };
    this.second_half = function () {
        var result = new Coon_Bezier();
        result.InitXY();
        if (this.x != null && this.y != null) {
            result.x = this.x.second_half();
            result.y = this.y.second_half();
        }
        return result;
    };

    this.BezierInterpol = function (C1, C2, D1, D2) {
        if (this.x != null)
            this.x.BezierInterpol(C1.x, C2.x, D1.x, D2.x);
        if (this.y != null)
            this.y.BezierInterpol(C1.y, C2.y, D1.y, D2.y);
    };

    this.GetPoints = function () {
        if (this.x != null && this.y != null) {
            var p = this.x.GetPoints();
            var q = this.y.GetPoints();
            if (p != undefined && p != null && q != undefined && q != null) {
                var result = new Array();
                for (var i = 0; i < 4; i++) {
                    result.push(p[i]);
                    result.push(q[i]);
                }
                return result;
            }
        }
        return null;
    };

    this.GetPointsReverse = function () {
        if (this.x != null && this.y != null) {
            var px = this.x.GetPointsReverse();
            var qy = this.y.GetPointsReverse();
            if (px != undefined && px != null && qy != undefined && qy != null) {
                var result = new Array();
                for (var i = 0; i < 4; i++) {
                    result.push(px[i]);
                    result.push(qy[i]);
                }
                return result;
            }
        }
        return null;
    };

    this.Distance = function () {
        if (this.x != null && this.y != null)
            return this.x.Distance() + this.y.Distance();
        else
            return null;
    };
}

function _BiInterpol(c0, c1, c2, c3, x, y, x_scale, y_scale)
{
    var x1 = c0 + parseInt((c3 - c0) * x / x_scale);
    var x2 = c1 + parseInt((c2 - c1) * x / x_scale);
	var r = x1 + parseInt((x2 - x1) * y / y_scale);
	return r;
}

function Coon_Color() {
    this.comp = [];

    this.BiInterpol = function (colors, x, y, x_scale, y_scale) {
        for (var i = 0; i < 3; i ++)
			this.comp[i] = _BiInterpol(colors[0].comp[i], colors[1].comp[i], colors[2].comp[i], colors[3].comp[i], 
					x, y, x_scale, y_scale);
    };

    this.Distance = function (o) {
        var max = 0;
        var diff = 0;
        max = Math.abs(this.comp[0] - o.comp[0]);
        diff = Math.abs(this.comp[1] - o.comp[1]);
        if (max < diff) max = diff;
        diff = Math.abs(this.comp[2] - o.comp[2]);
        if (max < diff) max = diff;
        return max;
    };
}

function PatchDrawer() {
    this.patch_colors = [null,null,null,null];//Coon_Color
    this.max_delta = 0;		// max color derivation
    this.path = new PathObj();//path data
    this.cnvs = null; //canvas
    this.alpha = 255;
    this.InitClr = function () {
        for (var i = 0; i < 4; i++) {
            var clr1 = new Coon_Color();
            this.patch_colors[i] = clr1;
        }
    };
    this.Draw = function (x_scale, y_scale, left, bottom, C1, C2, D1, D2) {
        // first, get patch metrics. If it's so small, then we'll just gonna draw it
        var bSmall = C1.Distance() < 2 && C2.Distance() < 2 && D1.Distance() < 2 && D2.Distance() < 2;
        // color interpolation
        var div_colors = [4];
        div_colors[0] = new Coon_Color();
        div_colors[1] = new Coon_Color();
        div_colors[2] = new Coon_Color();
        div_colors[3] = new Coon_Color();

        var d_bottom, d_left, d_top, d_right;
        div_colors[0].BiInterpol(this.patch_colors, left, bottom, x_scale, y_scale);
        if (!bSmall) {
            div_colors[1].BiInterpol(this.patch_colors, left, bottom + 1, x_scale, y_scale);
            div_colors[2].BiInterpol(this.patch_colors, left + 1, bottom + 1, x_scale, y_scale);
            div_colors[3].BiInterpol(this.patch_colors, left + 1, bottom, x_scale, y_scale);

            // Get color distance
            d_bottom = parseInt(div_colors[3].Distance(div_colors[0]));
            d_left = parseInt(div_colors[1].Distance(div_colors[0]));
            d_top = parseInt(div_colors[1].Distance(div_colors[2]));
            d_right = parseInt(div_colors[2].Distance(div_colors[3]));
        }

        if (bSmall || (d_bottom < 4 && d_left < 4 && d_top < 4 && d_right < 4)) {
            // Now we simply fill the patch
            var arrPathPoints = new Array();
            var p1 = C1.GetPoints();
            var q2 = D2.GetPoints();
            var p2 = C2.GetPointsReverse();
            var q1 = D1.GetPointsReverse();


            //var strokeRGB = "RGB(" + r + "," + g + "," + b + ")";
            var b = div_colors[0].comp[2];
            var g = div_colors[0].comp[1];
            var r = div_colors[0].comp[0];
            var fillRGB = "RGB(" + r + "," + g + "," + b + ")";
            //now we use bezier function to draw path
            var ctx = this.cnvs.getContext("2d");

            if (p1 != null && p2 != null && q1 != null && q2 != null) {
                ctx.save();
                ctx.setTransform(1, 0, 0, 1, 0, 0);
                ctx.strokeStyle = fillRGB;
                ctx.fillStyle = fillRGB;
                ctx.lineWidth = 1.5;

                ctx.beginPath();
                ctx.moveTo(p1[0], p1[1]);
                ctx.bezierCurveTo(p1[2], p1[3], p1[4], p1[5], q2[0], q2[1]);
                ctx.bezierCurveTo(q2[2], q2[3], q2[4], q2[5], p2[0], p2[1]);
                ctx.bezierCurveTo(p2[2], p2[3], p2[4], p2[5], q1[0], q1[1]);
                ctx.bezierCurveTo(q1[2], q1[3], q1[4], q1[5], p1[0], p1[1]);
                ctx.closePath();

                ctx.globalAlpha = 1.0;
                ctx.stroke();
                ctx.fill();
                ctx.restore();
            }
            
        } else {
            if (d_bottom < 4 && d_top < 4) {
                // split horizontally
                var m1 = new Coon_Bezier();
                m1.InitXY();
                m1.BezierInterpol(D1, D2, C1, C2);
                y_scale *= 2;
                bottom *= 2;
                // bottom
                this.Draw(x_scale, y_scale, left, bottom, C1, m1, D1.first_half(), D2.first_half());
                // top
                this.Draw(x_scale, y_scale, left, bottom + 1, m1, C2, D1.second_half(), D2.second_half());
            } else if (d_left < 4 && d_right < 4) {
                // split vertically
                var m2 = new Coon_Bezier();
                m2.InitXY();
                m2.BezierInterpol(C1, C2, D1, D2);
                x_scale *= 2;
                left *= 2;
                // left
                this.Draw(x_scale, y_scale, left, bottom, C1.first_half(), C2.first_half(), D1, m2);
                // right
                this.Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), C2.second_half(), m2, D2);
            } else {
                // Have to split into four
                // Get middle lines
                var m1 = new Coon_Bezier();
                m1.InitXY();
                var m2 = new Coon_Bezier();
                m2.InitXY();
                m1.BezierInterpol(D1, D2, C1, C2);
                m2.BezierInterpol(C1, C2, D1, D2);

                var m1f = m1.first_half();
                var m1s = m1.second_half();
                var m2f = m2.first_half();
                var m2s = m2.second_half();

                // Increase both scales
                x_scale *= 2;
                y_scale *= 2;
                left *= 2;
                bottom *= 2;

                // left-bottom
                this.Draw(x_scale, y_scale, left, bottom, C1.first_half(), m1f, D1.first_half(), m2f);
                // left-top
                this.Draw(x_scale, y_scale, left, bottom + 1, m1f, C2.first_half(), D1.second_half(), m2s);
                // Draw right-bottom quater
                this.Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), m1s, m2f, D2.first_half());
                // Draw right-top quarter
                this.Draw(x_scale, y_scale, left + 1, bottom + 1, m1s, C2.second_half(), m2s, D2.second_half());
            }
        }
    };
}

function _DrawCoonPatchMeshes(bTensor, arrCoonPatchs, matrix, alpha, cnvs){
    var patch = new PatchDrawer();
    patch.alpha = alpha;
    patch.cnvs = cnvs;
    patch.InitClr();

    var coordX = new Array();
    var coordY = new Array();
    var point_count = bTensor ? 16 :12;
    var iPatch = 0;
    while (iPatch < arrCoonPatchs.length) {
        var coonPatch = arrCoonPatchs[iPatch];
        ++iPatch;
        var flag = coonPatch.GetFlag();
        
        var iPoint = 0;
        for (var i = 0; i < point_count; i ++) {
            var point = coonPatch.GetPoint(iPoint);
            ++iPoint;
            var rel = matrix.TransFormPoint(point[0], point[1]);
			coordX[i] = rel[0];
			coordY[i] = rel[1];
            
		}

        // Calc bounding box and check if we need to draw this patch at all
        var min_x = coordX[0];
        var max_x = coordX[0];
        var min_y = coordY[0];
        var max_y = coordY[0];
	    for (var k = 1; k < point_count; k ++) {
		    if (min_x > coordX[k]) min_x = coordX[k];
		    if (max_x < coordX[k]) max_x = coordX[k];
		    if (min_y > coordY[k]) min_y = coordY[k];
		    if (max_y < coordY[k]) max_y = coordY[k];
	    }

		if (max_x <= 0 || min_x >= cnvs.width || max_y <= 0 ||min_y >= cnvs.height) {
			// Yes we can ignore this patch
			continue;
		}

        // Get color
        var iClr = 0;
		for (var i = 0; i < 4; i ++) {
			var clr = coonPatch.GetRGB(iClr);
			++iClr;
			var patch_clr = patch.patch_colors[i];
			if (patch_clr != undefined && patch_clr != null) {
			    patch_clr.comp[0] = clr[0];
			    patch_clr.comp[1] = clr[1];
			    patch_clr.comp[2] = clr[2];
			}
			
		}
        // Get initial coefficiences
		var C1 = new Coon_Bezier();
        var C2 = new Coon_Bezier();
        var D1 = new Coon_Bezier();
        var D2 = new Coon_Bezier();
        C1.InitXY();
        C2.InitXY();
        D1.InitXY();
        D2.InitXY();

		C1.FromPoints(coordX[0], coordY[0], coordX[11], coordY[11], coordX[10], coordY[10],
				coordX[9], coordY[9]);
		C2.FromPoints(coordX[3], coordY[3], coordX[4], coordY[4], coordX[5], coordY[5],
				coordX[6], coordY[6]);
		D1.FromPoints(coordX[0], coordY[0], coordX[1], coordY[1], coordX[2], coordY[2],
				coordX[3], coordY[3]);
		D2.FromPoints(coordX[9], coordY[9], coordX[8], coordY[8], coordX[7], coordY[7],
				coordX[6], coordY[6]);
		patch.Draw(1, 1, 0, 0, C1, C2, D1, D2);
    }//end while
}
//----------------------------


function _DrawShadingPattern(shadingPattern, mtFinal, rcDeviceDest,alpha, cnvs) {
    // Check whether we need to fill backgroud color first
    
    var ctx = cnvs.getContext("2d");
    if (shadingPattern.m_BackGround != null && shadingPattern.m_BackGround.length == 3) {
        var rgbA = [255, 0, 0, 255];
        rgbA[0] = shadingPattern.m_BackGround[0];
        rgbA[1] = shadingPattern.m_BackGround[1];
        rgbA[2] = shadingPattern.m_BackGround[2];
        rgbA[3] = alpha;

        var fillRGB = "RGB(" + rgbA[0] + "," + rgbA[1] + "," + rgbA[2] + ")";
        ctx.fillStyle = fillRGB;
        //ctx.setTransform(mtFinal.a, mtFinal.b, mtFinal.c, mtFinal.d, mtFinal.e, mtFinal.f);
        ctx.setTransform(1, 0, 0, 1, 0, 0);
        ctx.fillRect(0, 0, cnvs.width, cnvs.height);
    }
    // Check bbox of the shading
    // TESTDOC: Bug #2818 - type3_pattern.pdf
    /*
    if (shadingPattern.m_BBox.length == 4 && ((shadingPattern.m_BBox[0] != shadingPattern.m_BBox[2] || shadingPattern.m_BBox[1] != [3]))) {
        ctx.setTransform(mtFinal.a, mtFinal.b, mtFinal.c, mtFinal.d, mtFinal.e, mtFinal.f);
        ctx.beginPath();
        ctx.rect(shadingPattern.m_BBox[0], shadingPattern.m_BBox[1], shadingPattern.m_BBox[2], shadingPattern.m_BBox[3]);
        ctx.closePath();
     //   ctx.clip();
      //  ctx.fillRect(shadingPattern.m_BBox[0], shadingPattern.m_BBox[1], shadingPattern.m_BBox[2], shadingPattern.m_BBox[3]);

	}
    */
    
    var x=0;var y=0;
    var w = cnvs.width; var h = cnvs.height;
    
    var rect_bmp = [];
    rect_bmp[0] = x;
    rect_bmp[1] = y;
    rect_bmp[2] = x + w;
    rect_bmp[3] = y+h;
    var imgData = ctx.getImageData(0, 0, cnvs.width, cnvs.height);
    switch(shadingPattern.m_ShadingType) {
    case 1:
        _DrawFuncShading(shadingPattern, mtFinal, cnvs, rcDeviceDest, alpha);
    	break;
 case 2:
     _DrawAxialShading(cnvs, mtFinal, shadingPattern, rcDeviceDest, alpha);
     //  _DrawAxialShading2(imgData, w, h, mtFinal, shadingPattern, alpha);
     //  ctx.putImageData(imgData, x, y);
     //   _DrawAxialShading1(shadingPattern, mtFinal, alpha, cnvs);
     break;
 case 3:
    // (shadingpattern, mtObj2Device, clipRect, cnvs, alpha)
     _DrawRadialShading(shadingPattern, mtFinal, rcDeviceDest, cnvs, alpha);
    	break;
    case 4:
        {
            _DrawFreeGouraudShading(imgData, w, h, mtFinal, shadingPattern.m_arrMeshVertex, alpha, cnvs);
          //  ctx.putImageData(imgData, x,y);
        }
    	break;
    case 5:
        {
           _DrawLatticeGouraudShading(imgData, w, h, mtFinal, shadingPattern.m_arrMeshVertex, shadingPattern.m_nVerticesPerRow, alpha,cnvs);
           // ctx.putImageData(imgData, x,y);
        }
    	break;
    case 6:
    case 7:
        _DrawCoonPatchMeshes(shadingPattern.m_ShadingType-6, shadingPattern.m_arrCoonPatchs, mtFinal, alpha, cnvs);
    	break;
    default:
    }
//    ctx.restore();
}

//////////////////////////////////////////////////////////////////////////
//For TillingPattern

function _DrawTillingPatternBitmap(cnvs, pdPage, tP, w, h, mtObj2Dev) {
    var mtP2F = new PDMatrix();
    mtP2F.Set(tP.m_mtPattern2Form.a, tP.m_mtPattern2Form.b, tP.m_mtPattern2Form.c, tP.m_mtPattern2Form.d, tP.m_mtPattern2Form.e, tP.m_mtPattern2Form.f);
    var t_cell_bbox = mtP2F.TransFormRect(tP.m_BBox[0], tP.m_BBox[1], tP.m_BBox[2], tP.m_BBox[3]);
    var cell_bbox = mtObj2Dev.TransFormRect(t_cell_bbox[0], t_cell_bbox[1], t_cell_bbox[2], t_cell_bbox[3]);

    // We have to adjust the matrix so the cell rect fit perfectly inside the device
	var bitmap_rect = [0, 0, w, h];	
	var mtAdjust = new PDMatrix();
	mtAdjust.MatchRect(bitmap_rect, cell_bbox);

	// The total matrix is the display matrix with adjustment
    var mtPattern2Bitmap = PDMatrix.prototype.Concat2mt(mtObj2Dev, mtAdjust);
    
    var r = new PDRenderContext();
    r.AppandObjList(tP.m_pdForm.GetPageObjects(), mtPattern2Bitmap);
    r.Render(cnvs, null, null, 0);
    
}

function _DrawTillingPattern(cnvs, pdPage, tP, pathObj, mtObj2Dev, rcDeviceDest, bStroke, fillAlpha, fillArgb) {
    var ctx = cnvs.getContext("2d");
  //  var mtP2F = new PDMatrix();
  //  mtP2F.Set(tP.m_mtPattern2Form[0], tP.m_mtPattern2Form[1], tP.m_mtPattern2Form[2], tP.m_mtPattern2Form[3], tP.m_mtPattern2Form[4], tP.m_mtPattern2Form[5], tP.m_mtPattern2Form[6]);
    var mtPattern2Device = PDMatrix.prototype.Concat2mt(tP.m_mtPattern2Form, mtObj2Dev);

    // Check if the pattern is aligned: bbox as same dimension as X/Y steps, 
	// and we currently only process when pattern2device matrix is up-right
    var bAligned = false;
    if (tP.m_BBox[0] == 0 && tP.m_BBox[3] == 0 &&
			tP.m_BBox[2] == tP.m_xStep && tP.m_BBox[1] == tP.m_yStep &&
			(mtPattern2Device.IsScaled() || mtPattern2Device.Is90Rotated())) {
		        bAligned = true;
		        // For aligned pattern, in order to avoid ugly rounding artifact, we adjust the step to device units
		        // TESTDOC: Bug #553
		    }

    // get bounding box of the cell to determine the size of ARGB device
	var cell_bbox = mtPattern2Device.TransFormRect(tP.m_BBox[0], tP.m_BBox[1], tP.m_BBox[2], tP.m_BBox[3]);
	cell_bbox[0] = Math.ceil(cell_bbox[0]);
	cell_bbox[1] = Math.ceil(cell_bbox[1]);
	cell_bbox[2] = Math.ceil(cell_bbox[2]);
	cell_bbox[3] = Math.ceil(cell_bbox[3]);
	
	// We used to use rounding, but it seems we have to use ceiling, otherwise some unaligned pattern will display grid
	// TESTDOC: Bug #8389 - Chadwick_Spring_09_Issue.pdf 
	var width = Math.ceil(cell_bbox[2] - cell_bbox[0]);
	var height = Math.ceil(cell_bbox[3] - cell_bbox[1]);
	if (width == 0) width = 1;
	if (height == 0) height = 1;

    // Get a device to pattern matrix
	var mtDevice2Pattern = new PDMatrix();
	mtDevice2Pattern.SetReverse(mtPattern2Device);

    // Calculate step indices for four boundaries
	var min_col, max_col, min_row, max_row;
	var clip_box_p = mtDevice2Pattern.TransFormRect(rcDeviceDest[0], rcDeviceDest[1], rcDeviceDest[2], rcDeviceDest[3]);
    min_col = parseInt(Math.ceil((clip_box_p[0]- tP.m_BBox[2])/tP.m_xStep));//(clip_box_p.left - pPattern->m_BBox.right), pPattern->m_XStep)
	max_col = parseInt(Math.floor((clip_box_p[2]- tP.m_BBox[0])/tP.m_xStep));//clip_box_p.right - pPattern->m_BBox.left, pPattern->m_XStep
	min_row = parseInt(Math.ceil((clip_box_p[3]- tP.m_BBox[1])/tP.m_yStep));//(clip_box_p.bottom - pPattern->m_BBox.top, pPattern->m_YStep)
	max_row = parseInt(Math.floor((clip_box_p[1] - tP.m_BBox[3]) / tP.m_yStep)); //(clip_box_p.top - pPattern->m_BBox.bottom, pPattern->m_YStep)

	var temp = 0;
	if(min_row > max_row)
	{
		temp = max_row;
		max_row = min_row;
		min_row = temp;
	}
	var clipWidth = clip_box_p[2] - clip_box_p[0];
	var clipHeight = clip_box_p[3] - clip_box_p[1];
	if (width > clipWidth || height > clipHeight || width * height > clipWidth * clipHeight) {  

	    //If pattern is uncolored, we should clone the grahpic states first;
	    if (!tP.m_bClred) {

	    }

        for (var col = min_col; col <= max_col; col ++)
			for (var row = min_row; row <= max_row; row ++) {
				// Get origin position in device space
				var orig_x, orig_y;
				orig_x = col * tP.m_xStep;
				orig_y = row * tP.m_yStep;
				var rel = mtPattern2Device.TransFormPoint(orig_x, orig_y);
                orig_x = rel[0];
                orig_y = rel[1];
				// Calculate an offset matrix
				// We use mtPattern2Device instead of pObj2Device
				// TestDoc: #45357 - Transparent Images in CSS _ Image Transparency 101 (1).pdf 
				
                var matrix = new PDMatrix();
                matrix.Set(mtObj2Dev.a, mtObj2Dev.b, mtObj2Dev.c, mtObj2Dev.d, mtObj2Dev.e, mtObj2Dev.f) ;
				matrix.Translate(orig_x - mtPattern2Device.e, orig_y - mtPattern2Device.f);

				var r = new PDRenderContext();
			    r.AppandObjList(tP.m_pdForm.GetPageObjects(), matrix);
			    r.Render(cnvs, null, null, 0);
			    
            }
            return;

    }

        if (bAligned) {
            var orig_x = Math.round(mtPattern2Device.e);
            var orig_y = Math.round(mtPattern2Device.f);

            min_col = parseInt((rcDeviceDest[0] - orig_x) / width);
            if (rcDeviceDest[0] < orig_x) min_col--;
            max_col = parseInt((rcDeviceDest[2] - orig_x) / width);
            if (rcDeviceDest[2] <= orig_x) max_col--;
            min_row = parseInt((rcDeviceDest[1] - orig_y) / height);
            if (rcDeviceDest[1] < orig_y) min_row--;
            max_row = parseInt((rcDeviceDest[3] - orig_y) / height);
            if (rcDeviceDest[3] <= orig_y) max_row--;
        }
        	// Get left/top offset (against the origin) of the image
	var left_offset = Math.ceil(cell_bbox[0] - mtPattern2Device.e);
	//var y = cell_bbox[3] > cell_bbox[1] ? cell_bbox[3] : cell_bbox[1];
	var top_offset = Math.ceil(cell_bbox[3] - mtPattern2Device.f);

	//Now, Get the cell bitmap
	//var c = document.getElementById('myCanvas');
	

	var c = document.createElement("canvas");
    c.width = width;
    c.height = height;
    var ctx_bmp = c.getContext("2d");
    ctx_bmp.clearRect(0, 0, width, height);
//    var cc = c.getContext("2d");
 //   cc.fillStyle = '0x00000000';
 //   cc.fillRect(0, 0, width, height);

   // _DrawTillingPatternBitmap(cnvs, tP, width, height, mtObj2Dev);
    _DrawTillingPatternBitmap(c, pdPage, tP, width, height, mtObj2Dev);
        
        
        if (!tP.m_bClred) {

            var b = (fillArgb >> 16) & 0xFF;
            var g = (fillArgb >> 8) & 0xFF;
            var r = fillArgb & 0xFF;

            var imgData = ctx_bmp.getImageData(0, 0, width, height);
            for (var i = 0; i < imgData.data.length; i += 4) {

                if (imgData.data[i + 0] == 255 && imgData.data[i + 1] == 255 && imgData.data[i + 2] == 255)
                    continue;
                imgData.data[i + 0] = r;
                imgData.data[i + 1] = g;
                imgData.data[i + 2] = b;

            }
            ctx_bmp.putImageData(imgData, 0, 0);
        }
        //var c2 = document.getElementById('myCanvas');
        var c2 = document.createElement("canvas");
        c2.width = cnvs.width;
        c2.height = cnvs.height;
        var ctx_bmp2 = c2.getContext("2d");
        ctx_bmp2.clearRect(0, 0, clipWidth, clipHeight);
        for (var col = min_col; col <= max_col; col ++) {
		    for (var row = min_row; row <= max_row; row ++) {
			    // Calculate left/top point of the current tile
			    var start_x, start_y;
			    if (bAligned) {
				    start_x = Math.round(mtPattern2Device.e) + col * width - rcDeviceDest[0];
				    start_y = Math.round(mtPattern2Device.f) + row * height - rcDeviceDest[1];
			    } else {
				    // Get origin position in device space
				    var orig_x = col * tP.m_xStep;
				    var orig_y = row * tP.m_yStep;
				    var rel = mtPattern2Device.TransFormPoint(orig_x, orig_y);

				    // Calc left-top position of the transformed image
				    start_x = Math.round(rel[0] + left_offset - rcDeviceDest[0]);
				    start_y = Math.round(rel[1] + top_offset - rcDeviceDest[1]);
			    }

			    ctx_bmp2.drawImage(c, start_x, start_y);
		    }
}




	//var imgTiling = ctx_bmp2.getImageData(0, 0, rcDeviceDest[2] - rcDeviceDest[0], rcDeviceDest[3] - rcDeviceDest[1]);
	//ctx.putImageData(imgTiling, rcDeviceDest[0], rcDeviceDest[1]);
	ctx.setTransform(1,0,0,1,0,0);
	ctx.drawImage(c2, rcDeviceDest[0], rcDeviceDest[1]/*, rcDeviceDest[2] - rcDeviceDest[0], rcDeviceDest[3] - rcDeviceDest[1]*/);
}
